Tôi có nên tiếp tục đầu tư vào cấu trúc dữ liệu và thuật toán? [đóng cửa]


28

Ngày nay, tôi đang đầu tư rất nhiều vào các cấu trúc dữ liệu và thuật toán và cố gắng giải một số câu đố lập trình.
Tôi đang cố gắng viết mã và giải quyết bằng Java và Clojure.

Tôi đang lãng phí thời gian của tôi? Tôi có nên đầu tư nhiều hơn vào các công nghệ và khung mà tôi đã biết để có được kiến ​​thức sâu hơn (trong và ngoài) và có thể viết mã với chúng nhanh hơn không?

Bằng cách nghiên cứu cấu trúc dữ liệu và thuật toán, tôi sẽ trở thành một lập trình viên giỏi hơn hay những môn học đó chỉ quan trọng trong những năm đại học?


5
Những cấu trúc dữ liệu và thuật toán bạn đang làm việc với? Những câu đố lập trình bạn đang sử dụng chúng trên?
oosterwal

Tôi đang làm việc / chưa làm việc trên các bảng Hash, Bản đồ, Heaps, Đồ thị, Cây và các thuật toán đi kèm (di chuyển ngang, băm, tìm kiếm, chèn, xóa và một số thuật toán sắp xếp). Các câu đố là từ các cuộc thi TopCoder và Google Code Jam.
Chiron

Câu trả lời:


24

Hoàn toàn có thể dành hầu hết / tất cả sự nghiệp của bạn để làm công việc quan trọng, hữu ích, chỉ với kiến ​​thức tối thiểu về thuật toán và cấu trúc dữ liệu.

Các tối thiểu mức độ kiến thức cho các thuật toán và datastructures, để thành công, sẽ yêu cầu bạn phải:

  • nhận thức được hầu hết trong số họ (bao gồm cả việc đọc lên những cái mới thỉnh thoảng khi họ đi ra)
  • biết nơi để tìm thấy tốt, thử nghiệm, thực hiện làm việc
  • có thể so sánh các thuật toán và tính hữu dụng của chúng
  • có thể sao chép chính xác một ví dụ từ một ví dụ nguồn mở vào môi trường cụ thể của bạn, với một chút tinh chỉnh

Không có * tối đa * . Nếu bạn muốn, bạn có thể học lên cấp độ tiến sĩ và hơn thế nữa. Tính hữu dụng của nó liên quan trực tiếp đến loại công việc mà bạn quan tâm, và loại công việc nào bạn thấy thú vị và bổ ích nhất.

Điều đó nói rằng, như một hướng dẫn thô (nhưng không tuyệt đối), ngôn ngữ, khung và ứng dụng mà bạn đang làm việc sẽ càng ở mức độ thấp, càng ít tự động hóa thì mức độ kỹ năng cần thiết càng cao. đến các thuật toán và cấu trúc dữ liệu. Ví dụ, việc triển khai thuật toán của Ukkonen trong lắp ráp sẽ có khả năng, nhưng không nhất thiết, có nghĩa là bạn sẽ muốn có sự hiểu biết ở cấp độ thạc sĩ về thuật toán và cấu trúc dữ liệu liên quan.

Trong tình huống cụ thể của bạn, từ nền tảng phát triển Java sang làm việc trên các iO, tất cả những thứ khác đều bằng nhau, mong đợi một nhu cầu cao hơn một chút về hiểu biết chung về thuật toán và cấu trúc dữ liệu của bạn. Bạn sẽ muốn có thể chạy hiệu quả trên một thiết bị có ít tài nguyên hơn. Ngoài ra, hy vọng sẽ thêm một vài danh mục mới vào kho vũ khí của bạn - đáng chú ý nhất là bạn sẽ muốn biết thêm về quản lý bộ nhớ.


2
Hoàn toàn đồng ý. Tôi gần như không bao giờ phải đối phó trực tiếp với các thuật toán vì phần lớn những thứ cần thiết đã được đưa vào các thư viện cơ bản. Nhưng tôi sẽ gặp rắc rối nếu tôi không hiểu đủ các đặc điểm hiệu suất để chọn thuật toán hoặc cấu trúc phù hợp cho trường hợp sử dụng cụ thể. OP, trừ khi bạn muốn làm việc trong các thuật toán, bạn có thể nhận được khoản đầu tư tốt hơn , nhiều , tốt hơn nhiều cho thời gian học các thư viện và công cụ và kỹ thuật khác.
quentin-starin

1
Ugh, viết thuật toán của Ukkonen bằng Python là đủ khó, tôi thậm chí có thể bắt đầu tưởng tượng việc thực hiện nó trong lắp ráp.
rjzii

2
Điều này nằm trong điểm "thuật toán so sánh", nhưng tôi chỉ muốn giải thích rằng bạn nên biết sự đánh đổi giữa độ phức tạp của không gian và thời gian. Nhiều thuật toán thường được sử dụng trên máy tính để bàn do tốc độ của chúng có thể không khả thi trên iOS vì chúng yêu cầu cấu trúc dữ liệu lớn.
Karl Bielefeldt

3
Tôi không đồng ý. Lý do đơn giản là khi ai đó dành thời gian học Thuật toán hoặc Thiết kế hoặc Kiến trúc, nó không chỉ là về thời điểm anh ta sẽ sử dụng nó. Nó chỉ làm cho người đó thông minh hơn và anh ta có thể sử dụng việc học trong khi giải quyết các vấn đề khác. Nó cũng khuyến khích một cảm giác làm việc tối ưu. Ví dụ. có thể không có một thuật toán làm bằng tay cho tất cả mọi thứ nhưng vì bạn biết rất nhiều thứ bạn có thể tự mình làm với một cái gì đó đặc biệt.
Geek

14

Không Nếu bạn chỉ mới bắt đầu thì cố gắng tham gia vào các công cụ hình ảnh lớn như lập trình UI và điều đó chỉ cản trở bạn. Cuối cùng, bạn cần phải đến đó và tìm hiểu các khung lớn hơn ... cách sử dụng các cấu trúc dữ liệu và thuật toán mà những người KHÁC đã viết. Khi bạn mới bắt đầu mặc dù thật tốt khi dính vào các vấn đề phạm vi hạn chế.

Các thuật toán và cấu trúc dữ liệu về cơ bản là nền tảng của mọi thứ mặc dù có thể bạn sẽ không bao giờ viết một trong những thứ của riêng bạn một khi bạn đã qua giai đoạn mới bắt đầu. Biết họ, hoặc ít nhất là đã biết họ, cuối cùng sẽ giúp bạn trở thành một nhà phát triển tốt hơn. Bạn sẽ biết khi nào và tại sao nên sử dụng từng cái vì bạn sẽ biết chúng hoạt động như thế nào. Ngoài ra, làm cho các thuật toán và cấu trúc dữ liệu của bạn trở nên chung chung để chúng có thể hoạt động với bất kỳ loại hoặc loại nào với giao diện X thực sự là thứ bạn sẽ sử dụng cho phần còn lại của sự nghiệp.

Tôi thấy quá nhiều người nhảy vào những thứ như Qt, những người cuối cùng đặt câu hỏi cho thấy không có kiến ​​thức về C ++ (chẳng hạn). Họ đang cố gắng bỏ qua quá nhiều bước và cuối cùng họ phải mất nhiều thời gian hơn để học. Tôi muốn nói rằng bạn đang đi đúng hướng.


Tôi đã làm lập trình Java một cách chuyên nghiệp (ý tôi là được tuyển dụng) từ năm 2007. Bây giờ tôi sẽ (ít nhất là tôi hy vọng) sẽ thực hiện một số phát triển iOS.
Chiron

9

Bạn không lãng phí thời gian của bạn.

Nếu trong quá trình thực hiện công việc của bạn, bạn cần sử dụng một công cụ hoặc khung mà bạn chưa từng sử dụng trước đây, bạn sẽ học nó và sử dụng nó.

Tuy nhiên, nếu bạn cần sử dụng cấu trúc dữ liệu hoặc thuật toán mà bạn chưa từng sử dụng trước đây, rất có thể bạn sẽ không biết nó tồn tại và bạn sẽ giải quyết vấn đề của mình bằng cách sử dụng một số kỹ thuật tối ưu phụ khủng khiếp cần nhiều hơn nỗ lực và quy mô khủng khiếp.

Điều tôi đang cố gắng nói là, đây là thứ mà bạn sẽ không học bằng cách làm, bạn cần học nó bằng cách học , trong tình huống học tập, hoặc thông qua đầu tư cá nhân, như bạn làm bây giờ.


6

Trong thực tế, hãy lưu ý các cấu trúc dữ liệu có sẵn là gì, đặc điểm phức tạp của chúng là gì, nơi để triển khai tốt chúng và nơi bạn giữ bản sao Giới thiệu về Thuật toán để tìm kiếm chi tiết sau này.


1

Nếu đó là điều khiến bạn hạnh phúc, thì bạn chắc chắn nên gắn bó với nó. Nếu bạn lo lắng mình không áp dụng đủ lý thuyết, hãy xem xét một dự án nặng về lý thuyết. Xây dựng một ngôn ngữ lập trình nhỏ, như Potion , từ đầu. Việc thực hiện đầy đủ sẽ sử dụng các bảng Hash, Đồ thị, Cây và một loạt các thuật toán khổng lồ. Nếu nó có vẻ thú vị, bạn có thể đi sâu hơn vào tối ưu hóa, tạo mã gốc hoặc khả năng mở rộng của người dùng.

Bạn sẽ trở thành một lập trình viên tốt hơn khi bạn quan tâm và tập trung, không phải khi bạn làm việc trong các dự án có vẻ thực tế mà hơi buồn tẻ.

Xuống hố thỏ, Dorothy!


1

Tôi đã dành rất nhiều thời gian để hack trong C / C ++ với OpenGL. Tôi biết ngôn ngữ và API đủ tốt ... và tôi đã trở thành một nhà phát triển và lập trình viên hợp lý nhờ trải nghiệm đó. Điều đó nói rằng, kiến thức thuật toán thực tế cần có để giải quyết các vấn đề khác nhau mà tôi chỉ thực sự có thể nắm bắt được.

Phát biểu từ kinh nghiệm cá nhân, tập trung vào việc xây dựng các ứng dụng sẽ lãng phí thời gian của bạn nếu bạn không biết lý thuyết đằng sau các lĩnh vực vấn đề liên quan đến những gì bạn đang cố gắng xây dựng.

Đối với nhiều loại phần mềm khác nhau, các miền này sẽ xuất phát từ các nguyên tắc cơ bản mà bạn học được từ nghiên cứu thuật toán, ngoài lý thuyết dựa trên thích hợp cụ thể của riêng chúng (ví dụ: đại số tuyến tính trong đồ họa máy tính, lý thuyết số / thông tin trong mật mã, v.v.).

Bạn không nhất thiết phải trở thành một pháp sư tính toán đằng sau mọi thứ, nhưng làm những gì bạn đang làm tại thời điểm đăng bài này là một con đường rất, rất cần thiết để đi xuống ít nhất một lần trong hành trình lập trình của một người - bất kể có hay không không phải họ tự học.


0

Tôi đoán nếu bạn không biết rõ về họ thì bạn sẽ không tìm thấy lý do để sử dụng chúng. Tôi dường như tìm thấy việc sử dụng chúng mọi lúc. Nhưng tôi phải thừa nhận rằng với những cải tiến về thuốc generic trong nửa chục năm qua hoặc do đó, nhu cầu tự lăn của bạn xảy ra ngày càng ít hơn. Điều đó vẫn không loại bỏ những lợi ích của việc biết cách sử dụng chúng và khi nào và chúng có thể đơn giản hóa rất nhiều mã phức tạp khác.

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.