Làm thế nào để trau dồi trực giác thuật toán?


17

Khi gặp phải sự cố trong phần mềm, tôi thường thấy giải pháp ngay lập tức. Tất nhiên, những gì tôi nhìn thấy thường hơi lệch, và tôi luôn luôn cần phải ngồi xuống và thiết kế (thừa nhận, tôi thường không thiết kế đủ), nhưng tôi nhận được một số trực giác ngay lập tức.

Vấn đề của tôi là tôi không nhận được cùng một trực giác khi nói đến các thuật toán nâng cao. Tôi cảm thấy nhiều hơn nữa với nhiệm vụ xây dựng một số khác Facebook sau đó tạo một tìm kiếm Google khác hoặc Music Genom project. Có lẽ vì tôi đã được xây dựng phần mềm trong một thời gian, nhưng tôi có ít kinh nghiệm với soạn các thuật toán.

Tôi muốn lời khuyên của cộng đồng về những gì cần đọc và những dự án thực hiện tốt hơn trong việc soạn các thuật toán.

(Câu hỏi này không có gì để làm với Algorithmic composition. Vâng, gần như không có gì)

8

+1 Đối với bất kỳ ai nói kinh nghiệm là giáo viên giỏi nhất.

Có một số cổng trực tuyến có nhiều vấn đề về lập trình, bạn có thể gửi các giải pháp của riêng mình và nhận chỉ báo vượt qua/thất bại tự động.

  1. http://www.spoj.pl/
  2. http://uva.onlinejudge.org/
  3. http://www.topcoder.com/tc
  4. http://code.google.com/codejam/contests.html
  5. http://projecteuler.net/

Các USACO training site là chương trình đào tạo mà tất cả USA máy tính tham gia Olympiad đi qua. Nó đi từng bước, giới thiệu các thuật toán phức tạp hơn và nhiều hơn nữa khi bạn đi.


7

Steve Yegge gọi "The Algorithm Design Manual" trong one của rants của mình. Tôi đã không nhìn thấy nó bản thân mình, nhưng nó có vẻ như nó chỉ là vé từ mô tả của mình.

Yêu thích tuyệt đối của tôi đối với loại chuẩn bị phỏng vấn này là Hướng dẫn thiết kế thuật toán của Steven Skiena. Hơn bất kỳ cuốn sách nào khác, nó giúp tôi hiểu được các vấn đề về đồ thị (và quan trọng) đáng kinh ngạc như thế nào - chúng phải là một phần của mỗi bộ công cụ lập trình viên làm việc. Cuốn sách cũng bao gồm các cấu trúc dữ liệu cơ bản và các thuật toán phân loại, đó là một phần thưởng tốt đẹp. Nhưng mỏ vàng là nửa thứ hai của cuốn sách, đó là một loại bách khoa toàn thư của 1-pagers trên vô số các vấn đề hữu ích và nhiều cách khác nhau để giải quyết chúng, mà không có quá nhiều chi tiết. Hầu hết mọi máy nhắn tin đều có một hình ảnh đơn giản, giúp bạn dễ nhớ. Đây là một cách tuyệt vời để tìm hiểu cách xác định hàng trăm loại vấn đề.

  0

+1 để tham khảo sách. Trông khá thú vị. 21 feb. 092009-02-21 22:31:27


5

vấn đề miền

Trước tiên, bạn phải hiểu được những vấn đề tên miền. Một giải pháp thanh lịch cho vấn đề sai lầm là không tốt, cũng không phải là một giải pháp không hiệu quả cho vấn đề đúng trong hầu hết các trường hợp. Chất lượng giải pháp, nói cách khác, thường là tương đối. Một vấn đề lập kế hoạch đơn giản có giải pháp xác định mất mười phút để chạy có thể tốt nếu lịch biểu được tính toán một lần mỗi tuần, nhưng nếu lịch thay đổi vài lần trong ngày thì giải pháp thuật toán di truyền hội tụ trong vài giây có thể được yêu cầu.

phân hủy và lập bản đồ

Thứ hai, phân hủy các vấn đề thành các vấn đề và biết/yếu tố chưa biết tương ứng với các yếu tố của giải pháp. Đôi khi điều này hiển nhiên, ví dụ: để đếm các vật dụng, bạn cần một cách để xác định các widget, một bộ đếm gia tăng, và một cách để lưu trữ số đếm. Đôi khi nó không phải là quá rõ ràng. Đôi khi bạn phải phân tích vấn đề, miền và các giải pháp có thể cùng một lúc và thử một số ánh xạ khác nhau giữa chúng để tìm ra kết quả chính xác [đây là phương pháp chung].

mô hình

Làm mẫu giải pháp, trong đầu của bạn ít nhất và đi qua nó để xem nó có hoạt động chính xác hay không. Điều chỉnh khi cần thiết (Xem phần phân tách và ánh xạ, ở trên).

thành phần/interfaces

Nhiều lần bạn có thể tìm thấy các yếu tố của vấn đề và các yếu tố của giải pháp mà bản đồ với nhau và tạo ra kết quả một phần hữu ích. Cấu trúc thành phần và giao diện này cung cấp phần tử của giải pháp và cũng giúp giảm phạm vi của vấn đề còn lại. Vì vậy, sau đó bạn chỉ cần lặp lại đầu trang với một vấn đề ban đầu nhỏ hơn, và đi qua nó một lần nữa.

kinh nghiệm

Kinh nghiệm là người thầy tốt nhất, tất nhiên, nhưng đọc về các loại khác nhau của các vấn đề và các giải pháp cũng sẽ rất hữu ích. Nghiên cứu một số thuật toán nổi tiếng và các ứng dụng của chúng cũng rất hữu ích, ví dụ: Dijkstra, Bresenham, Unification và tất nhiên là graph theory.


9

Bạn có thể thấy hữu ích khi thực hiện các thuật toán về mặt vật lý. Ví dụ, khi bạn đang nghiên cứu các thuật toán sắp xếp, hãy thực hành mỗi thuật toán với một cỗ bài. Điều đó sẽ kích hoạt các phần khác nhau của bộ não của bạn hơn là đọc hoặc lập trình một mình sẽ.


0

Tôi không chắc chắn trực giác có thể được trồng, nhưng tôi nghĩ rằng tôi biết những gì bạn đang yêu cầu. Bạn càng giải quyết được nhiều vấn đề, bạn càng có nhiều thông tin và kinh nghiệm hơn để xử lý các vấn đề trong tương lai. Vì vậy, tôi nói chỉ là thực hành. Thực hành lập trình các ứng dụng thế giới thực và bạn gặp rất nhiều vấn đề. Đôi khi, giải quyết các câu đố cũng có thể rất giáo dục.


0

Tôi cố gắng tìm các điểm tương tự vật lý khi tôi xem xét một vấn đề phức tạp.