Lựa chọn ngôn ngữ lập trình để học cấu trúc dữ liệu và thuật toán [đóng]


79

Bạn muốn giới thiệu ngôn ngữ lập trình nào để học về cấu trúc dữ liệu và thuật toán ?

Xem xét những điều sau:

  • Kinh nghiệm cá nhân
  • Tính năng ngôn ngữ (con trỏ, OO, v.v.)
  • Sự phù hợp để học các khái niệm DS & A

Tôi hỏi vì có một số cuốn sách có ngôn ngữ lập trình-bất khả tri (viết từ góc độ Toán học và sử dụng mã giả). Nếu tôi học được từ một trong những thứ này, tôi muốn chọn một ngôn ngữ lập trình để viết mã và chạy các thuật toán trong đó.

Sau đó, có những cuốn sách khác giới thiệu các khái niệm DS & A với các ví dụ được viết bằng một ngôn ngữ lập trình cụ thể - và tôi cũng muốn viết mã các thuật toán này - do đó, ở một mức độ nhất định, ngôn ngữ cũng chọn cuốn sách.

Dù bằng cách nào, tôi phải chọn một ngôn ngữ và tôi muốn gắn bó với một ngôn ngữ trong suốt. Bỏ sở thích ngôn ngữ cá nhân sang một bên, cái nào là tốt nhất cho mục đích này?


Không có cách nào có thể để trả lời câu hỏi này ngoại trừ câu hỏi cụ thể và cần thêm thông tin.
David Thornley

@David Thornley: Tôi hiểu rằng nó có một chút kết thúc mở, nhưng nó đã nhận được rất nhiều câu trả lời thực sự tuyệt vời!
bguiz

Có rất nhiều điều đáng lo ngại về hiệu quả sử dụng năng lượng (thường là: thời gian) của các thuật toán và cấu trúc dữ liệu: nếu và khi bạn muốn đo lường điều này, hãy tìm kiếm các hệ thống có các số có ý nghĩa được tái tạo (và dễ dàng).
greybeard

Câu trả lời:


88

Câu trả lời cho câu hỏi này phụ thuộc vào chính xác những gì bạn muốn học.

Python và Ruby

Các ngôn ngữ cấp cao như Python và Ruby thường được đề xuất vì chúng ở cấp cao và cú pháp khá dễ đọc. Tuy nhiên, tất cả các ngôn ngữ này đều có tính trừu tượng đối với các cấu trúc dữ liệu chung. Không có gì ngăn cản bạn triển khai các phiên bản của riêng mình như một bài tập học tập nhưng bạn có thể thấy rằng bạn đang xây dựng cấu trúc dữ liệu cấp cao trên các cấu trúc dữ liệu cấp cao khác, điều này không nhất thiết hữu ích.

Ngoài ra, Ruby và Python là các ngôn ngữ được nhập động. Điều này có thể tốt nhưng nó cũng có thể gây nhầm lẫn cho người mới bắt đầu và có thể khó bắt lỗi hơn (ban đầu) vì chúng thường sẽ không rõ ràng cho đến khi chạy.

C

C ở cực còn lại. Thật tốt nếu bạn muốn tìm hiểu các chi tiết thực sự ở mức thấp như cách quản lý bộ nhớ nhưng quản lý bộ nhớ đột nhiên là một yếu tố quan trọng cần cân nhắc, chẳng hạn như cách sử dụng đúng malloc () / free (). Điều đó có thể gây mất tập trung. Ngoài ra, C không phải là hướng đối tượng. Đó không phải là một điều xấu mà chỉ đơn giản là đáng lưu ý.

C ++

C ++ đã được đề cập. Như tôi đã nói trong phần bình luận, tôi nghĩ đây là một sự lựa chọn khủng khiếp . C ++ cực kỳ phức tạp ngay cả khi sử dụng đơn giản và có rất nhiều "gotchas" vô lý. Ngoài ra, C ++ không có lớp cơ sở chung. Điều này rất quan trọng vì cấu trúc dữ liệu như bảng băm dựa vào đó là một lớp cơ sở chung. Bạn có thể triển khai một phiên bản cho lớp cơ sở danh nghĩa nhưng nó kém hữu ích hơn một chút.

Java

Java cũng đã được đề cập. Nhiều người thích ghét Java và đúng là ngôn ngữ này cực kỳ dài dòng và thiếu một số tính năng ngôn ngữ hiện đại hơn (ví dụ: bao đóng) nhưng không có gì thực sự quan trọng. Java được gõ tĩnh và có tính năng thu gom rác. Điều này có nghĩa là trình biên dịch Java sẽ bắt được nhiều lỗi mà các ngôn ngữ được nhập động sẽ không xảy ra (cho đến thời gian chạy) và không xử lý được lỗi phân đoạn (không có nghĩa là bạn không thể rò rỉ bộ nhớ trong Java; rõ ràng là bạn có thể). Tôi nghĩ Java là một lựa chọn tốt.

C #

C # là ngôn ngữ giống như một phiên bản Java hiện đại hơn. Giống như Java, nó là một ngôn ngữ biên dịch trung gian được quản lý (thu gom rác) chạy trên một máy ảo. Mọi ngôn ngữ khác được liệt kê ở đây ngoài C / C ++ cũng chạy trên một máy ảo nhưng Python, Ruby, v.v. được thông dịch trực tiếp thay vì biên dịch sang mã bytecode.

Về cơ bản, C # có những ưu và nhược điểm giống như Java.

Haskell (v.v.)

Cuối cùng, bạn có các ngôn ngữ chức năng: Haskell, OCaml, Scheme / Lisp, Clojure, F #, v.v. Những ngôn ngữ này suy nghĩ về tất cả các vấn đề theo một cách rất khác và đáng để học tại một số điểm nhưng nó lại đi vào những gì bạn muốn học: lập trình chức năng hoặc cấu trúc dữ liệu? Tôi muốn học từng thứ một thay vì nhầm lẫn vấn đề. Nếu bạn học một ngôn ngữ chức năng tại một số điểm (mà tôi muốn giới thiệu), Haskell là một lựa chọn an toàn và tốt.

Lời khuyên của tôi

Chọn Java hoặc C #. Cả hai đều có IDE miễn phí, tuyệt vời (Eclipse, Netbeans và IntelliJ Community Edition cho Java, Visual Studio Express cho C #, phiên bản cộng đồng Visual studio) giúp việc viết và chạy mã trở nên nhanh chóng. Nếu bạn không sử dụng cấu trúc dữ liệu gốc nào phức tạp hơn một mảng và bất kỳ đối tượng nào bạn tự viết, bạn sẽ học về cơ bản giống như bạn học trong C / C ++ nhưng không cần thực sự quản lý bộ nhớ.

Hãy để tôi giải thích: một bảng băm có thể mở rộng cần được thay đổi kích thước nếu đã thêm đủ phần tử. Trong bất kỳ triển khai nào có nghĩa là thực hiện một số việc như tăng gấp đôi kích thước của cấu trúc dữ liệu hỗ trợ (thường là một mảng) và sao chép trong các phần tử hiện có. Việc triển khai về cơ bản là giống nhau trong tất cả các ngôn ngữ mệnh lệnh nhưng trong C / C ++, bạn phải đối mặt với các lỗi phân đoạn khi bạn không phân bổ hoặc phân bổ thứ gì đó một cách chính xác.

Python hoặc Ruby (nó không thực sự quan trọng) sẽ là lựa chọn tiếp theo của tôi (và rất gần với hai cái kia) chỉ vì lúc đầu, việc nhập động có thể có vấn đề.


1
@cletus: Cảm ơn vì câu trả lời hợp lý! Bạn muốn giới thiệu cuốn sách DS&A / tài liệu hướng dẫn nào khác (dành cho java hoặc python)?
bguiz

3
@bguiz, bạn có thể muốn đặt một câu hỏi riêng về điều đó. Có một số câu hỏi về chủ đề này để tham khảo trên stackoverflow.com/search?q=book+data+structures+algoritms Bạn có thể tinh chỉnh câu hỏi đó bằng cách thêm [java] hoặc [python] vào tìm kiếm.
cletus

2
Tôi KHÔNG sử dụng Java và C # chủ yếu vì định hướng OO nghiêm ngặt không cần thiết cho việc này. Hơn nữa: ai quan tâm đến việc viết mã Chung khi điểm đang học cấu trúc dữ liệu? Theo suy nghĩ của tôi, bạn có thể chọn ngôn ngữ kịch bản (Python) và tập trung vào cấp cao hoặc bạn chọn ngôn ngữ cấp thấp C / C ++ và thử xem cách nó được triển khai ở cấp máy. Việc dừng giữa chừng dường như không đáng.
Matthieu M.

3
Python không được biên dịch thành bytecode trước? Tin tức cho tôi: docs.python.org/release/2.5.2/lib/bytecodes.html
Adam Crossland

Điều này không có ý nghĩa gì: “Điều này quan trọng bởi vì cấu trúc dữ liệu như bảng băm dựa vào việc có một lớp cơ sở chung”. Bảng băm dựa vào các phần tử có thể băm được, nhưng các chi tiết cụ thể về cách thực hiện điều này trong ngôn ngữ lập trình không liên quan đến định nghĩa trừu tượng của cấu trúc dữ liệu.
pyon

44

Tôi muốn giới thiệu Javachủ yếu vì:

  • thu gom rác thải
  • người giới thiệu
  • bộ sưu tập phong phú

CHỈNH SỬA: Xuống cử tri vui lòng giải thích.


3
tại sao mọi người lại bỏ phiếu điều này?
Mantas Vidutis

19
Tôi nghĩ từ chối điều này vì bạn không thích Java (điều này dường như đang xảy ra) là vô trách nhiệm. Bạn có thể không thích Java nhưng nó đủ đơn giản để sử dụng làm ngôn ngữ học tập. Vì vậy, +1 từ tôi.
cletus

7
+1. Không phải sự lựa chọn của tôi, nhưng thực sự, nó không khủng khiếp. Điểm bình chọn giống như bạn đề xuất COBOL.
Rob Lachlan

4
+1 vì đối với người mới bắt đầu: 1. Chính xác, bạn không phải lo lắng về việc cấp phát bộ nhớ / dealloc (ít nhất là đối với các chương trình nhỏ). Thay vào đó, bạn có thể tập trung vào những gì bạn phải học vào lúc này. 2. Có, không có con trỏ lén lút, hoặc con trỏ tới con trỏ. Đừng hiểu sai ý tôi, tôi yêu C ++. 3. Các bộ sưu tập trong Java có lẽ là bộ cấu trúc dữ liệu tinh tế nhất mà tôi từng thấy. Chúng thực sự nên có trong từ điển dưới cấu trúc dữ liệu. :)
crunchdog

9
Nếu bạn không hiểu cách quản lý tài nguyên của riêng mình, nghĩa là bạn chưa học được nhiều về cấu trúc dữ liệu.
Alan

29

Theo tôi, C sẽ là ngôn ngữ tốt nhất để học các cấu trúc dữ liệu và thuật toán vì nó sẽ buộc bạn phải viết theo ý mình. Nó sẽ buộc bạn phải hiểu con trỏ, cấp phát bộ nhớ động và triển khai đằng sau cấu trúc dữ liệu phổ biến như danh sách được liên kết, bảng băm, v.v. Nhiều thứ trong số đó là những thứ bạn có thể coi là đương nhiên trong các ngôn ngữ cấp cao hơn (Java, C #, v.v. ).


10
Con trỏ và phân bổ bộ nhớ động không dạy bạn gì về cấu trúc dữ liệu và thuật toán nhưng chúng cản trở nghiêm trọng những gì bạn có thể hy vọng đạt được.
JD

1
Tôi đồng ý. Sau khi tiếp xúc với hàng tá ngôn ngữ khác nhau và đã học một ngôn ngữ cấp cao hơn, trừu tượng cao đầu tiên, thật là khó khăn khi tôi quyết định học C / C ++ và đột nhiên tôi phải đối mặt với rất nhiều thứ mà tôi chưa bao giờ giải thích được. trước. Học C trước (không phải C ++) là một lựa chọn tuyệt vời vì nó cho bạn thấy cách máy thực sự hoạt động và bạn có tất cả các giới hạn buộc phải tạo cấu trúc dữ liệu ngay từ đầu. Tất cả những gì ngôn ngữ cung cấp cho bạn là hàm (đối với thuật toán) và cấu trúc (đối với cấu trúc dữ liệu). Khoảng cách giữa lý thuyết và ngôn ngữ thực sự rất nhỏ.
Rafael Beckel

17

Pythontuyệt. Dễ đọc, đầy đủ tính năng. Nếu bạn định làm việc với mã giả, Python sẽ trông khá quen thuộc.

Python đã là ngôn ngữ thuật toán được lựa chọn tại UC Irvine , nơi nó được mô tả như vậy:
" Python đại diện cho một ngôn ngữ hướng thuật toán rất cần thiết trong giáo dục. Những lợi thế của Python bao gồm cú pháp giống như sách giáo khoa và tính tương tác khuyến khích thử nghiệm . "

Python cũng hoạt động theo cách thân thiện với người mới bắt đầu với Gato , một công cụ tạo đồ thị. Học thuật toán và cấu trúc dữ liệu là một trong những công cụ hàng đầu có thể giúp ích bằng cách được làm trực quan, điều mà Gato giúp bạn dễ dàng thực hiện (mà không cần học bất kỳ thư viện đồ thị phức tạp nào)


@mvid: Có sách DS & A dựa trên trăn mà bạn muốn giới thiệu không?
bguiz

1
@bguiz: Mặc dù tôi đã không đích thân đọc nó, cuốn sách điện tử miễn phí này tồn tại mà tập trung vào thuật toán và cấu trúc dữ liệu sử dụng OO bằng Python: brpreiss.com/books/opus7
Mantas Vidutis

Python là chỉ tuyệt vời nếu bạn xem xét việc mã hóa với khoảng trắng như một delimeter là tuyệt vời
Woot4Moo

Khoảng trắng làm dấu phân cách thật tuyệt vời!
Marcel Valdez Orozco

Cá nhân tôi không thích Python vì việc sử dụng thụt lề theo cú pháp của nó. Tôi thấy rằng việc tìm ra các lỗi ngớ ngẩn do lệch trục sẽ khó hơn so với cú pháp dựa trên dấu ngoặc nhọn và những thứ như vậy, được hỗ trợ với căn chỉnh giống nroff bổ sung.
Michael

13

Nếu mục đích là chỉ tìm hiểu về cấu trúc dữ liệuthuật toán , tôi sẽ nói JavaScript. Bạn có thể chạy mã của mình trong trình duyệt. Bạn có khả năng xử lý đối tượng rất linh hoạt và bạn có thể tập trung hoàn toàn vào cấu trúc dữ liệu và thuật toán chứ không phải quản lý bộ nhớ, cấu trúc ngôn ngữ hoặc những thứ khác sẽ làm mất trọng tâm của khoa học máy tính thực tế mà bạn đang học.

Phần thưởng cũng là bạn có thể dễ dàng hình dung các cấu trúc dữ liệu khác nhau bằng cách sử dụng trình duyệt để hiển thị đồ thị và cây bằng cách sử dụng DOM và Canvas.

Các khóa học CS trong những năm qua có xu hướng thay đổi ngôn ngữ mà môn học được giảng dạy, đơn giản vì việc triển khai ngôn ngữ mới hơn và tốt hơn giúp dễ học hơn đã xuất hiện, giúp dễ dàng tập trung vào vấn đề thực tế hơn.


+1 vì JavaScript cho phép người ta học lập trình chức năng một cách dễ dàng và với khả năng ứng dụng rộng rãi khi có thể phát triển các ứng dụng web với nó.
Dan Dascalescu,

Rất đúng. Tôi kiểm tra mã của mình trong đoạn mã công cụ dành cho nhà phát triển. Ngoài ra, tôi cũng có thể viết cấu trúc dữ liệu của riêng mình trong đó. Không có Danh sách liên kết hoặc bất kỳ cấu trúc nào khác được tích hợp sẵn trong đó. Eveything chỉ là vật thể. Trừ khi tôi đang lập trình cạnh tranh, còn không thì nó hoạt động để học tìm kiếm nhị phân, trie và tất cả các khái niệm khác. Không?
HalfWebDev

hoàn toàn đồng ý, chúng ta hãy tập trung vào logic mà không cần nhiều nghi lễ và cú pháp xương trần.
jtroconisa

8

Nếu bạn muốn đi theo con đường ít kháng cự nhất, thì Python. Nó sẽ có số lượng đĩa lò hơi không cần thiết tối thiểu và những thứ tương tự.

Tốt nhất, tôi muốn học các thuật toán trong C, vì vậy bạn có thể tìm hiểu những gì đang xảy ra ở cấp bộ nhớ; Tôi cũng muốn học các thuật toán bằng ngôn ngữ chức năng, vì vậy bạn có thể thấy các thuật toán tương tự hoạt động như thế nào với các cấu trúc dữ liệu liên tục.

Những cuốn sách nổi tiếng của Knuth chứa một lượng lớn mã trình biên dịch (nền tảng được phát minh). Điều này được khuyến khích nếu bạn muốn trở thành siêu hạng. Cá nhân tôi, mặc dù vậy, tôi đã làm việc ở C khi tôi đang làm việc trong lớp thuật toán của mình (tiết lộ: điều này chỉ là một vài năm trước). Đôi khi tôi đang giải quyết một số vấn đề trong Knuth, nhưng tôi không biết liệu tôi có sử dụng MMIX hoàn toàn như ngôn ngữ tôi lựa chọn để học thuật toán hay không. Đó là một chút quá mức cần thiết, tôi sẽ cảm thấy.

CHỈNH SỬA : Nó cũng phụ thuộc vào những gì bạn quen thuộc. Nếu bạn muốn bắt đầu làm việc thông qua một văn bản thuật toán ngay bây giờ và bạn chưa bao giờ làm việc nhiều với C, thì Python là câu trả lời chính xác. Bạn muốn ngôn ngữ không phải là một rào cản lớn để vượt qua, bởi vì bạn muốn tận hưởng điều này. Tôi biết tôi làm được.

Điểm cuối cùng: ít nhất là khi tôi học các thuật toán, tôi đã dành rất nhiều thời gian để làm việc trên giấy. Tôi nghĩ điều đó quan trọng - ý tôi là bạn muốn tìm hiểu về tiệm cận, v.v. Dành toàn bộ thời gian để triển khai các thuật toán bằng bất kỳ ngôn ngữ nào không phải là điều nên làm.


@Rob Lachlan: Có sách DS & A dựa trên trăn mà bạn muốn giới thiệu không?
bguiz

@bguiz: hầu hết các cuốn sách phong phú về thuật toán mà tôi thích đều là sách bất khả tri của lanugage - Cormen et al., Kleinberg và Tardos. Tôi thực sự sẽ không chọn một cái dựa trên ngôn ngữ.
Rob Lachlan

8

Tôi sẽ đề nghị Ada. Nó có các tính năng cho các cấu trúc dữ liệu không được tìm thấy trong các ngôn ngữ khác, chẳng hạn như kiểm tra phạm vi type Day is range 1 .. 31;Ngoài ra, nó có kiểm tra thời gian biên dịch và thời gian chạy rất nghiêm ngặt (trừ khi bạn chọn tắt nó), giúp bạn dễ dàng tìm thấy lỗi trong quá trình triển khai của mình.


8

Oberon-2 hoặc Thành phần Pascal . Cái cuối cùng là tập siêu của cái đầu tiên.

Einstein từng nói "Hãy làm cho nó càng đơn giản càng tốt, nhưng không đơn giản hơn". Cụm từ này đã được Giáo sư Niklaus Wirth chọn làm ngoại ngữ cho bản báo cáo tiếng Oberon gốc. Và nó đúng với những hậu duệ của Oberon đã nói ở trên.

Khi nói đến sự hoàn hảo của ngôn ngữ lập trình, tôi muốn trích dẫn Antoine de Saint-Exupéry: "Một nhà thiết kế biết rằng anh ta đã đạt đến sự hoàn hảo không phải khi không còn thứ gì để thêm vào, mà là không còn gì để bỏ đi nữa." . Wirth, ngay cả khi không đạt được điều này, vẫn đang đi đúng hướng. Trong "Dòng ngôn ngữ lập trình Wirth" (Algol -> Pascal -> Modula-2 -> Oberon -> Oberon-2), mỗi ngôn ngữ tiếp theo đơn giản hơn và đồng thời mạnh hơn ngôn ngữ trước.

Ngôn ngữ mạnh mẽ nhưng đơn giản theo nguyên tắc ít gây ngạc nhiên nhất. Gõ tĩnh mạnh mẽ, cơ sở hướng đối tượng dễ dàng, thu gom rác. Danh sách tính năng không lớn nhưng nó đủ để hoạt động hiệu quả và không làm phức tạp mọi thứ, đặc biệt là ở giai đoạn đầu.

Khi bạn muốn tìm hiểu các thuật toán và cấu trúc dữ liệu, bạn có nghĩa là nó. Nhưng nếu ngôn ngữ của bạn “mạnh” (có rất nhiều tính năng như C ++, C #, Java, Python,…) thì bạn sẽ lãng phí rất nhiều thời gian để học ngôn ngữ chứ không phải thuật toán và cấu trúc dữ liệu. Bạn sẽ không thấy rừng cho cây cối. =) Bạn có thể coi cây như các yếu tố cú pháp (và bất kỳ tính năng nào khác) và rừng là khái niệm quan trọng (bất kỳ thuật toán, cấu trúc dữ liệu nào, có thể là OOP, bất cứ điều gì). Bạn càng có nhiều tính năng (cây cối) trong ngôn ngữ của mình thì nhiệm vụ trở nên phức tạp hơn để lùi lại và hiểu các khái niệm (để nhìn thấy khu rừng).

Nhưng nếu ngôn ngữ thực sự mạnh mẽ (có các tính năng nhỏ đã được kiểm chứng rõ ràng) thì bản thân ngôn ngữ đó sẽ đứng ở vị trí thứ hai. Không có nhiều cây nên bạn có thể lùi lại một vài bước và ... Tôi nghĩ vậy là đủ các phép loại suy. =)

Ngoài ra, nhiều sách về thuật toán và cấu trúc dữ liệu sử dụng mã giả giống như Algol / Pascal và sẽ dễ dàng chuyển đổi các ví dụ bằng ngôn ngữ này. Và bạn có thể sử dụng trực tiếp các ví dụ từ cuốn sách "Thuật toán và cấu trúc dữ liệu" của Wirth. Ấn bản Oberon (2004), PDF (1,2 MB).

Một số liên kết bổ sung:


@kemiisto: cảm ơn vì sự thống nhất và mới lạ, câu trả lời - và các phép loại suy! Tôi cũng sẽ xem xét Oberon-2.
bguiz

2
Phiên bản tiếng Anh của câu tục ngữ là "Không thể nhìn thấy rừng cho cây."
Daniel Rose,

6

"Nếu công cụ duy nhất của bạn là một cái búa thì mọi vấn đề của bạn sẽ có xu hướng giống như những chiếc đinh"

Học ít nhất một vài ngôn ngữ.

Ngoài ra, sự lựa chọn của bạn phụ thuộc vào mục đích của bạn.

Sở thích? Công việc trong thế giới Windows? Họ Linux / UNIX?

Loại ứng dụng: kinh doanh so với khoa học; trình điều khiển phần cứng hoặc ứng dụng?

Ứng dụng máy tính để bàn hay ứng dụng web?

Tôi có một số gợi ý cho bạn.

(a) chắc chắn học một số J (miễn phí từ jsoftware.com; kế thừa của APL; cả J và APL đều là sáng tạo của Ken Iverson, người đoạt giải Turing ... Giải thưởng Turing giống như giải Nobel về máy tính).

(b) nếu bạn đang ở trong thế giới Windows, hãy bắt đầu bằng c # vì rất nhiều trong .NET chạy trên c #. Nếu bạn có thể, hãy lấy bản sao "Inside c #" của Tom Archer từ Microsoft Press. Bạn có thể tải xuống hệ thống phát triển c # miễn phí bằng cách tải xuống phiên bản express của Microsoft.

(c) học cách sử dụng TDD / BDD ... bất kể ngôn ngữ nào, trước tiên bạn viết một bài kiểm tra nhỏ gọi là bài kiểm tra đơn vị; tiếp theo bạn viết mã sản xuất để vượt qua bài kiểm tra đơn vị; từng bước nhỏ ... nó không chỉ là ngôn ngữ mà bạn sử dụng, nó còn là phương pháp luận.

(d) học một số ngôn ngữ trình hợp dịch ... trình hợp dịch ở cấp độ thấp, gần như ngôn ngữ máy, nó sẽ giúp bạn hiểu rõ về những gì đang diễn ra đằng sau hậu trường.

(e) bên ngoài thế giới Windows, tôi khuyên bạn nên dùng c ++.

Không có ngôn ngữ tốt nhất.

Nếu nó chỉ là về ngôn ngữ, lập trình sẽ dễ dàng hơn.

Bạn không chỉ muốn học các thuật toán rất cụ thể, bạn còn muốn tìm hiểu các mẫu tổng quát hơn và có thể giúp bạn trong việc lựa chọn cách tiếp cận để giải quyết một vấn đề nhất định.

Có một điều chắc chắn là bạn sẽ không bao giờ hết thứ để học nếu bạn định trở thành một lập trình viên.


@bguiz cấu trúc dữ liệu có thể dành cho tất cả các ý định hoàn toàn phụ thuộc vào ngôn ngữ; đây là một lý do để học các ngôn ngữ khác nhau. Bạn cũng sẽ gặp phải những khác biệt nhỏ có thể gây ra thất vọng và thậm chí đau buồn; ví dụ, đặt tên kiểu dữ liệu: bit cho SQL Server là bool cho c # và Boolean cho vb. kích thước kiểu dữ liệu cũng thay đổi; ví dụ, int trong c # được cố định ở 32 bit trong đó kích thước của nó trong c ++ và do đó dung lượng lưu trữ của nó phụ thuộc vào nền tảng. Bộ ký tự cũng ảnh hưởng đến kích thước cấu trúc dữ liệu của bạn; ví dụ, ASCII 7-bit, 8-bit ASCII, Unicode. Sau đó, có kích thước cố định so với thay đổi, v.v.
gerryLowry

"cấu trúc dữ liệu có thể dành cho tất cả các ý định hoàn toàn phụ thuộc vào ngôn ngữ". Để thực hiện hầu hết các cấu trúc dữ liệu chức năng thuần túy bằng một ngôn ngữ không cung cấp tính năng thu gom rác, về cơ bản bạn sẽ phải viết một trình thu gom rác. Đó là một trở ngại nghiêm trọng.
JD

Sau khi thành thạo OO, hãy cố gắng học lập trình khai báo.
greybeard,

4

Tôi nghĩ rằng Lisp đáng xem xét.

Khóa học lập trình đại học đầu tiên của tôi là ở Lisp. Trước đó, tôi đã viết chương trình bằng một số ngôn ngữ trong 10 năm. Tôi đã nghĩ rằng khóa học lập trình đầu tiên sẽ rất nhàm chán, nhưng tôi đã nhầm.

Lisp là một ngôn ngữ rất thú vị vì nó có cú pháp rất đơn giản. Tập trung thay đổi từ cú pháp sang chức năng. Phong cách lập trình hàm cũng là một điều cực kỳ đáng để học hỏi. Sau khóa học Lisp, tôi thấy mình viết các chương trình bằng C ++ theo một cách hoàn toàn mới, tốt hơn, nhờ những khái niệm mới mà Lisp đã dạy tôi.

Lisp cũng sử dụng cách biểu diễn tương tự cho mã và dữ liệu, mở ra cho thiết kế thuật toán thú vị với mã được tạo ngay lập tức và sau đó được thực thi.


3

Bạn có thể đánh giá cao một ngôn ngữ có kiểu dữ liệu đại số và đối sánh mẫu như Standard ML, OCaml, F # hoặc Haskell. Ví dụ: đây là một hàm để cân bằng lại cây tìm kiếm nhị phân màu đỏ-đen được viết bằng OCaml / F #:

let balance = function
  | R(R(a, x, b), y, c), z, d | R(a, x, R(b, y, c)), z, d
  | a, x, R(R(b, y, c), z, d) | a, x, R(b, y, R(c, z, d)) ->
      R(B(a, x, b), y, B(c, z, d))
  | a, x, b -> B(a, x, b)

10
Lời châm biếm của bạn được đánh giá cao, thưa ông.
ergosys

2

Tôi có thể sai, nhưng không phải cấu trúc dữ liệu và thuật toán độc lập với ngôn ngữ lập trình?

Cuối cùng, cấu trúc dữ liệu chỉ là một cách tổ chức dữ liệu; bất kỳ ngôn ngữ cấp cao nào sẽ hỗ trợ điều đó. Chắc chắn, một số ngôn ngữ nhất định sẽ có cơ chế triển khai các cấu trúc dữ liệu cơ bản (chẳng hạn như Collections Framework trong Java hoặc C ++ STL), nhưng nó không ngăn bạn lập trình cấu trúc dữ liệu bằng ngôn ngữ lập trình mà bạn chọn. Hơn nữa, các thuật toán được viết bằng mã giả, làm cho chúng trở nên độc lập với ngôn ngữ.

Tôi nhận ra rằng nó không thực sự trả lời câu hỏi của bạn, nhưng tôi đang gặp khó khăn khi nắm bắt những gì bạn đang tìm kiếm; học cấu trúc dữ liệu / thuật toán hoặc học một ngôn ngữ mới.


1
@Pran: Tôi biết rằng các thuật toán nằm trong mã giả - nhưng mã giả sẽ không biên dịch. Tôi là một người học kiểu thực hành, vì vậy để thực sự hiểu các khái niệm, tôi cần phải viết mã nó bằng một ngôn ngữ có thể biên dịch và chạy. Do đó, câu hỏi của tôi thực sự là ngôn ngữ nào phù hợp nhất cho việc này, theo nghĩa là mỗi ngôn ngữ sẽ có ưu và nhược điểm riêng, khiến một số ngôn ngữ trong số đó phù hợp hơn để học DS&A hơn những ngôn ngữ khác.
bguiz

@Pran: "Tôi có thể sai, nhưng không phải cấu trúc dữ liệu và thuật toán độc lập với ngôn ngữ lập trình sao?". Nếu ngôn ngữ không cung cấp GC thì bạn có thể phải viết một GC.
JD


0

Tôi thích C ++ hơn :)


19
-1 C ++ là một ngôn ngữ học tập tồi tệ (và có thể nói là bạn có thể loại bỏ điều kiện "học tập" khỏi câu lệnh đó).
cletus

4
Anh ta không cần phải học những góc tối của C ++ để viết mã các thuật toán của mình trong C ++. C ++ là hoàn toàn tốt.
Prasoon Saurav

9
vì vậy, bạn nghĩ rằng tốt nhất là nên thử và viết mã một lớp cho DS trong C ++ và nắm bắt sự khác biệt giữa phương thức tạo bản sao và ghi đè toán tử bằng, tham chiếu và con trỏ đi ra ngoài phạm vi, rò rỉ bộ nhớ do xóa / mới không chính xác sử dụng, v.v.? Tất cả đều khá cơ bản đối với C ++.
cletus

5
nhưng vấn đề là bạn không PHẢI học những thứ đó trong python hoặc java. C ++ đòi hỏi một sự đầu tư ban đầu lớn hơn nhiều, và không có cách nào có giá trị hơn để chức năng yêu cầu của OP
Mantas Vidutis

2
Bất kỳ lý do hợp lệ nào khiến Javascript không được khuyến khích học @cletus?
HalfWebDev
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.