Có vấn đề với cấu trúc dữ liệu phổ biến cho người mới bắt đầu? [đóng cửa]


17

Tôi đang tham gia khóa học thứ hai về Java. Chúng tôi đang nhận được vào cấu trúc dữ liệu. Tôi đã thực hiện một nhiệm vụ trên một danh sách được liên kết, và bây giờ là một ngăn xếp. Tôi đã có một thời gian khó khăn với danh sách liên kết. Việc xếp chồng cho tôi một chút rắc rối, nhưng dễ dàng hơn nhiều.

Tôi có nên lo lắng về việc có một thời gian khó khăn với các thuật toán và cấu trúc dữ liệu này không? Tôi chỉ cảm thấy mình không thực sự nắm bắt được nó.


Ví dụ trong thế giới thực của Danh sách được liên kết - stackoverflow.com/questions/644167/ từ
pramodc84

Câu trả lời:


44

Tôi nghĩ rằng, bạn không được chấp nhận không hiểu những điều này, bởi vì chúng thực sự cơ bản. Điều đó đang được nói, việc bạn không hiểu họ là không có gì để cảm thấy tồi tệ. Bạn có thể giải thích một danh sách liên kết với một đứa trẻ. Vì vậy, nếu giáo viên của bạn không giải thích chúng cho bạn, đó là lỗi của họ. Vì vậy, bạn không nên dành thời gian để lo lắng mà nên cố gắng tìm người, người có thể giải thích cho bạn. Thông thường một học sinh là một giáo viên tốt hơn nhiều so với một học tập toàn thời gian.

Hãy nghĩ về xe lửa

Hãy tưởng tượng, bạn có một bộ toa xe lửa, trong đó mỗi toa có đủ sức chứa, để chứa một phần dữ liệu. Mỗi cỗ xe có một số móc ở cuối của nó, có thể được gắn vào phía trước của cỗ xe khác.
Điều này trong thực tế cung cấp cho bạn một danh sách liên kết:

  • danh sách trống: tàu không chứa toa tàu (và do đó không mang dữ liệu)
  • thêm một yếu tố: thêm một cỗ xe mới chứa yếu tố phía trước tàu và móc nó vào phần còn lại của tàu
  • loại bỏ một phần tử: tìm cỗ xe chứa phần tử. Hủy bỏ nó (bạn có thể cần một cần cẩu ở đây :)), móc cỗ xe trước với cỗ xe sau.
  • thay thế một yếu tố: tìm cỗ xe chứa yếu tố cũ. Trao đổi phần tử cũ với phần tử mới.
  • chèn một phần tử ngay sau phần tử khác: tìm cỗ xe chứa phần tử mà sau đó bạn muốn chèn. Chèn một cỗ xe mới sau nó, được nối tương ứng (chúng tôi không muốn tàu bị vỡ) và đặt phần tử mới vào đó.

Ngược lại, bạn có thể nghĩ về một mảng như một đoàn tàu với một số toa xe nhất định, không thể được sắp xếp lại theo bất kỳ cách nào. Tất cả những gì bạn có thể làm là thay đổi dữ liệu trong đó. Mô hình này cũng giải thích rất nhiều vấn đề mảng có:

  • Nếu bạn muốn chèn một yếu tố trước một yếu tố khác, bạn sẽ phải di chuyển tất cả các yếu tố sau sang vận chuyển tiếp theo.
  • Nếu bạn muốn loại bỏ một yếu tố, bạn sẽ cần di chuyển tất cả các yếu tố sau một xe ngựa ra phía trước.
  • Nếu bạn cần một chuyến tàu có nhiều toa tàu, bạn sẽ phải xây dựng một chiếc mới, bởi vì bạn không thể chỉ cần đặt trước một cỗ xe. Mặt khác, việc tìm các toa xe trong một mảng dễ dàng hơn nhiều, bởi vì bạn có thể chỉ cần đánh số chúng vĩnh viễn (thứ tự của chúng sẽ không bao giờ thay đổi).

Đối với ngăn xếp: "Ngăn xếp" có cấu trúc dữ liệu ít hơn so với ý tưởng. Ý tưởng của ngăn xếp là, nó hoạt động giống như một chồng sách. Bạn chỉ có thể đặt sách lên trên chồng và bạn chỉ có thể lấy sách trên cùng ra khỏi chồng (ít nhất là nếu sách đủ nặng).
Điều đó đang được nói, một danh sách được liên kết có thể được sử dụng như một chồng, nếu bạn nghĩ dữ liệu trong xe ngựa là sách và cuốn sách trong cỗ xe đầu tiên là đầu của ngăn xếp.

Vì vậy, tôi hy vọng điều này đã giúp bạn. Có lẽ nó đã không. Có lẽ bạn là một loại hình ảnh. Trong trường hợp đó, tôi khuyên bạn nên tìm ai đó, người giỏi đưa ra những lời giải thích trực quan và giải thích cho bạn. Sẽ không mất nhiều thời gian, nhưng nó sẽ hoàn toàn xứng đáng.

Bây giờ ổn để đấu tranh với điều này. Nhưng chỉ đơn thuần là chấp nhận nó, không phải là một lựa chọn trong thời gian dài.


2
Câu trả lời tuyệt vời! Làm cho tôi nhận ra rằng người ta có thể dạy các cấu trúc dữ liệu cơ bản cho trẻ em thông qua một trò chơi flash / trò chơi khác với một loạt các mục tiêu cần hoàn thành. Ý tưởng tương tự về xe lửa cũng có thể giúp trẻ em nắm được số nhị phân, nếu mỗi chiếc xe lửa lớn hơn và nhỏ hơn gấp đôi so với hàng xóm của nó.
Công việc

1
Ok, bây giờ bạn đã có điều đó, hãy chuyển sang cấu trúc dữ liệu với nhiều liên kết. Vì vậy, đoàn tàu có một cú hích ở phía bên, có thể móc vào một bộ ô tô khác. Nhưng đường ray cho những chiếc xe đó trượt dọc theo đường đua đầu tiên ...
Philip

12

Tôi sẽ không nói rằng bạn "nên lo lắng" về điều đó, nhưng thực tế đơn giản là bạn thừa nhận điểm yếu của mình cho thấy bạn biết chính xác nơi để học tập chăm chỉ hơn. Tôi nghĩ rằng bạn sẽ được phục vụ tốt bởi thái độ đó và sẽ ổn trong thời gian dài.


6

Để trích dẫn giáo viên CSCI fav của tôi:

"Panic, but panic early."

Cấu trúc dữ liệu nghe có vẻ khó đúng không? Đối với tôi, nó nghe có vẻ trừu tượng và hơi phức tạp và hầu hết ... quan trọng!

Cấu trúc dữ liệu là một khóa học quan trọng. Và nó là phổ biến để đấu tranh, nhưng tiếp tục! Miễn là bạn ăn Wheaties của bạn và giữ nó, bạn sẽ đạt được cầu vồng với bagđầy generic items bên dưới.


Hoảng loạn sớm sẽ ngụ ý bỏ học? Sau các cấu trúc dữ liệu, cũng có các yêu cầu về toán học, thuật toán, HĐH, AI, trình biên dịch, lý thuyết tính toán ... nó không làm cho mẹ dễ sợ hơn, nhưng có lẽ thực tế là người ta không còn là sinh viên năm nhất hay sinh viên năm hai mặc dù công cụ đang trở nên khó khăn hơn
Công việc


3

Cấu trúc dữ liệu là lớp "cứng" đầu tiên tôi học; chúng tôi đã sử dụng Fortran 77 thay vì Java, nhưng các khái niệm phần lớn giống nhau.

Tôi mất nhiều thời gian hơn một tuần so với các bạn cùng lớp để tìm hiểu khái niệm về một danh sách được liên kết; Tôi đã tạm dừng bài tập, nhưng sau một vài buổi làm việc hơi bực bội với giáo sư của mình, cuối cùng nó cũng nhấp (theo nghĩa đen; tôi nghe thấy tiếng "click" trong đầu khi cuối cùng tôi cũng hiểu).

Mọi người đều gặp rắc rối ở đâu đó trong chương trình giảng dạy CS của họ (trừ khi họ là những kẻ lập dị). Nếu bạn hiểu điểm yếu của mình ở đâu và làm thế nào để giải quyết chúng, bạn thực sự không có gì phải lo lắng.


1
Đừng hoảng sợ, hãy tiếp tục làm việc và Đợi cho nhấp chuột ...
NWS

2

Bạn có gặp khó khăn trong việc hiểu danh sách được liên kết, hoặc chỉ gặp rắc rối với việc thực hiện của bạn?

Không có gì lạ khi một lập trình viên mới gặp khó khăn ở đó, bởi vì đây có thể là lần đầu tiên bạn phải nghĩ về ý nghĩa thực sự của nó khi bạn viết:

list.head = null;
Element e = new Element(...);
e.next = list.head;
list.head = e;

Tôi đã bị vặn vẹo trong ALGOL / W trong cùng một bài tập, vì tôi không hiểu lắm về ngữ nghĩa ngôn ngữ. Một năm sau, tôi hầu như không thể nhớ tại sao mình gặp khó khăn.


1

Chắc chắn có một số lĩnh vực phát triển phần mềm mà bạn thấy khó hơn những lĩnh vực khác. Cho dù đó là thuật toán nhất định, hoặc các mẫu thiết kế nhất định hoặc quy trình nhất định sẽ khác nhau tùy theo từng người. Tôi thấy rằng tôi phải sử dụng một cái gì đó trên một chương trình thực sự trước khi tôi hoàn toàn hiểu nó.

Tôi sẽ lo lắng hơn nếu ai đó tuyên bố biết tất cả và chưa bao giờ gặp vấn đề khi học một cái gì đó.

Cá nhân tôi dường như không bao giờ gặp vấn đề với các danh sách được liên kết, nhưng sau đó tôi đã làm việc trong một chương trình trong 8 năm sử dụng chúng ở mọi nơi vì vậy tôi đã làm việc với chúng hàng ngày. Miễn là bạn biết nơi tìm thông tin bạn cần để làm mới bộ nhớ và biết những khu vực bạn gặp "rắc rối" thì bạn sẽ ổn.


Tôi cũng nghĩ rằng nó sẽ hữu ích nếu tôi có thể tương tác với một chương trình sử dụng các cấu trúc dữ liệu này. Tôi đang ở giai đoạn mà tôi đang tự hỏi mình, tại sao những điều này sẽ hữu ích?
Brock

0

Tôi gặp rắc rối với tính toán và phải thực hiện lần thứ hai. Lần thứ hai tôi phát hiện ra mình thông minh nhưng giáo viên toán đầu tiên về cơ bản là vô dụng :)

Bạn sẽ tìm thấy rất nhiều người trong ngành CNTT không thể giao tiếp tốt, thậm chí là giáo viên. Mặt khác, một số người trong ngành CNTT thực sự là những nhà văn và nhà truyền thông bậc thầy.

Đôi khi đọc bên ngoài thực sự có thể giúp đỡ. Sách máy tính rất khác nhau về chất lượng. Hãy vào Amazon và xem những gì cuốn sách mọi người thích thực sự thích.

Chúc may mắn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.