Làm thế nào để tôi học các thuật toán và cấu trúc dữ liệu? [đóng cửa]


38

Điều này tiếp nối với câu hỏi trước đây của tôi , nơi tôi đã hỏi có cần thiết phải tìm hiểu các thuật toán và cấu trúc dữ liệu. Tôi cảm thấy có nó là.

Bây giờ tôi làm việc trong một môi trường mà tôi sẽ không bao giờ có cơ hội học nó bằng cách thử nghiệm hoặc thực tế hoặc trong bất kỳ nhiệm vụ nào. Cách tiếp cận đúng như sách đúng, loại vấn đề phù hợp, loại tài nguyên phù hợp mà tôi có thể trải qua để cung cấp sáu tháng hoặc một hoặc hai năm để tìm hiểu thuật toán và cấu trúc dữ liệu? Và cũng uốn nắn tâm trí của tôi theo cách nó có thể liên quan đến các vấn đề với các cấu trúc dữ liệu và thuật toán.


3
Cormen là bạn của bạn :)
Lukasz Madon

1
@lukas: Mặc dù vậy vẫn chưa hoàn thành nó, có khá nhiều môn toán trong đó mà tôi không thấy thoải mái. Nó đã làm nhiều hơn với kiến ​​thức của tôi về các thuật toán, cấu trúc dữ liệu và phân tích của chúng, rằng bất kỳ nguồn đơn lẻ nào khác :)
Matthieu M.

Bạn cũng có thể thử dự án của tôi, mô tả các thuật toán và cấu trúc dữ liệu phổ biến đơn giản hơn wikipedia và chứa mã souce gần như cho mọi bài viết (cấu trúc, cách tiếp cận, thuật toán) ... en.algoritmy.net
malejpavouk

Câu trả lời:


40

Đọc.

Không, thực sự, đọc.

Đọc tất cả mọi thứ về thuật toán và thiết kế bạn có thể tìm thấy. Có những cuốn sách phi thường ngoài kia. Các cuốn sách thuật toán Sedgewick là tốt. Hướng dẫn thiết kế thuật toán của Skiena là tốt. Cùng nhau những cuốn sách này theo tôi trên mỗi kệ sách ở mọi công việc tôi làm, cùng với Tháng huyền thoại.

Rồi hỏi.

Nói chuyện với những người bạn tôn trọng. Hỏi họ những điểm quyết định nào họ có và tại sao họ lại đưa ra quyết định. Những người giỏi sẽ luôn có thể nói với bạn "Tôi đã chọn làm X vì nó tốt hơn A, B theo những cách này. Tôi có thể đã đi với C, nhưng tôi cảm thấy đây là một lựa chọn tốt hơn vì điều này".

Tiếp theo, làm.

Xây dựng công cụ. Xây dựng những thứ mà bạn sẽ không bao giờ sử dụng. Xây dựng những thứ mà bạn sẽ không bao giờ cần. Đi viết một chương trình giải câu đố Sudoku. Bây giờ đi làm lại. Và một lần nữa. Xây dựng nó 5 cách hoàn toàn khác nhau. Xây dựng một chương trình tạo ra các câu đố Sudoku và đưa nó vào bộ giải. Tìm người giải là nhanh nhất. Và sau đó...

Tìm hiểu tại sao.

"Cái gì" gần như không bao giờ quan trọng. Ý tôi là, vâng, điều quan trọng là phải hoàn thành dự án trong tay, nhưng cuối cùng nếu bạn biết "cái gì" mà không biết "tại sao", thì bạn có thể không bao giờ thực hiện nó ngay từ đầu. Bạn có một điểm đạn trong hồ sơ của bạn. Đi lấy một cái bánh quy và chúc mừng chính mình. "Tại sao" quan trọng hơn nhiều so với "cái gì".

Và đối với hồ sơ Sudoku là một ví dụ. Tôi đã dành rất nhiều thời gian rảnh để trải qua bài tập đó với vô số câu đố logic trên Kongregate và học được rất nhiều trên đường đi.

http://www.amazon.com/Bundle-Alacticms-Parts-1-5-Fundamentals/dp/020172684X/ http://www.amazon.com/Alerskym-Design-Manual-Steven-Skiena/dp/1848000693/ http://www.amazon.com/Mythical-Man-Month-Software-Engineering-Annlahoma/dp/0201835959/


câu trả lời thực sự rất tốt Tôi thích cách bạn thực hiện lời khuyên của bạn!
paxRoman

Tôi cũng mang theo sách của Sedgewick và Skienna ở mọi nơi! đó có lẽ là một lý do khác tại sao tôi yêu câu trả lời của bạn!
paxRoman

và Cormen để trộn.
AruniRC

1
Trong thời đại ngày càng có nhiều thông tin trên internet, điều quan trọng là phải thêm: đọc sách (tất nhiên không phải độc quyền). Giới thiệu nhất quán, mạch lạc về một vấn đề dài hơn 2-3 trang HTML được phân tách quảng cáo là A Good Thing ™ ! Đừng đánh giá thấp nó (và vâng, tất nhiên sách điện tử là tốt).
Joachim Sauer

1
Đã đồng ý. Tính nhất quán là chìa khóa. Thật khó để tìm hiểu cấu trúc dữ liệu khi bạn nhận được một hoặc hai từ hàng tá nguồn khác nhau. Sách cũng có xu hướng có sơ đồ tốt hơn (một số blog / nguồn trực tuyến làm, nhưng như một cuốn sách tổng quát thì tốt hơn). Các cuốn sách Sedgewick có một sơ đồ kết hợp đặc biệt tốt, đơn giản để làm theo mã và mô tả.
Hounshell

10

Thuật toán

Tôi đã học những bài học phép thuật trong môi trường nhóm khi tôi mười hai tuổi. Tên pháp sư là Joe Carota. Anh ấy đã làm một trò lừa một lần và tôi buột miệng, "Làm thế nào mà bạn làm được điều đó?" Anh ấy nói điều gì đó ngày hôm đó đã bị mắc kẹt với tôi.

Câu trả lời của Joe, "Michael, nếu bạn thực sự muốn biết thủ thuật đó được thực hiện như thế nào, bạn phải tìm ra cách bạn sẽ tự làm nó."

Tất nhiên đó không phải là điều tôi muốn nghe nhưng nó khiến tôi tập trung vào giải quyết vấn đề. Đây là vấn đề giải quyết từ quan điểm của tôi. Nếu nỗ lực đầu tiên của tôi trong việc giải quyết vấn đề mất mười bảy bước và thực sự klunky, thì tin tốt là tôi đã giải quyết được vấn đề.

Sau đó, bằng cách nhìn vào giải pháp tôi đã phát triển và tìm cách tinh chỉnh giải pháp đó, tôi sẽ học cách sắp xếp kết quả cuối cùng. Sau này trong cuộc đời lập trình máy tính của tôi, tôi phát hiện ra rằng quá trình này được gọi là "Tinh chỉnh từng bước". Tôi nghĩ hôm nay họ gọi nó là tái cấu trúc.

Nó làm việc sau đó nó vẫn hoạt động bây giờ.





1

Cố gắng đăng ký một khóa học cấp đại học về cấu trúc dữ liệu và thuật toán, việc học các khái niệm này cùng với các khái niệm khác luôn là điều tốt.


Tôi tốt nghiệp ngành khoa học máy tính và đã sáu năm kể từ đó. Tôi chưa bao giờ tập trung vào những chủ đề này ở đó là web, tính khả dụng, máy chủ của khách hàng, điều đó đã thu hút tôi và tôi chỉ làm việc trên các lĩnh vực này nhưng bây giờ tôi cảm thấy mình cũng nên học chúng. Quan điểm của bạn là gì.
sushil bharwani

Quay trở lại và tham gia một khóa bồi dưỡng :-)
Martijn Verburg

1

Bắt đầu làm việc để giải quyết các vấn đề cổ điển trên ví dụ trực tuyến , trang web có thể trông không lạ mắt lắm, nhưng đây là những vấn đề lập trình cổ điển đòi hỏi nhiều cấu trúc dữ liệu và thuật toán quan trọng được sử dụng ngày nay.

Các giải pháp có thể được gửi bằng nhiều ngôn ngữ lập trình từ C / C ++ đến JavaScript, Lisp, Smalltalk, trình biên dịch + khoảng 40 ngôn ngữ khác. Vì vậy, bạn có thể tập trung hoàn toàn vào việc giải quyết vấn đề với bất kỳ ngôn ngữ lập trình nào bạn cảm thấy thoải mái.


1

CLRS

Đây là tài nguyên yêu thích của tôi. Tôi đã sử dụng nó trong khóa học thuật toán khoa học máy tính đại học của mình và cuối cùng tôi đã mua cuốn sách 4 năm sau đó để tự đọc để chuẩn bị cho các khóa học MS Comp Sci của mình. Nó không phải là dễ đọc bằng bất kỳ phương tiện nào nhưng nếu bạn làm việc để hiểu một số phép toán / bằng chứng được trình bày và sau đó triển khai mã giả trong ngôn ngữ yêu thích của bạn, thì nó cũng đáng giá với mức giá khá đắt. Hướng dẫn thiết kế thuật toán mà những người khác đã đề cập cũng là một tài nguyên tuyệt vời để học cách xác định vấn đề nhưng tôi thấy CLRS tốt hơn cho chi tiết thuần túy.


0

Bạn luôn có thể thử một cái gì đó như thế này: http://codekata.pragprog.com/

Tôi luôn học tốt hơn bằng cách nghĩ nó trái ngược với việc đọc. Tuy nhiên, bạn nên có sẵn tài liệu / tài liệu đọc để tìm câu trả lời.


0

Mua cuốn sách này , cho mượn cái này hoặc ăn cắp cái này! Phần còn lại sẽ theo sau :)

Giới thiệu về thuật toán của Rivest và Cormen. Sẽ rất khó để theo dõi ban đầu một khi bạn vượt qua lời giải thích của Mergesort trong phần giới thiệu. Tất cả mọi thứ mở ra cho bạn đẹp.

Thêm vào đó bạn sẽ trở nên tốt hơn nếu bạn giải quyết các vấn đề được đưa ra trong cuốn sách. Tôi chưa bao giờ thực sự muốn chia tay với cuốn sách ngay cả sau khi tốt nghiệp trường. Điều đó thật tốt.

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.