Một lời khuyên cho một người tự học về sự phức tạp tính toán


7

Tôi là một sinh viên đại học toán học (sẽ bắt đầu năm thứ ba của tôi rất sớm). Tôi đang cố gắng dạy cho bản thân sự phức tạp tính toán. Đáng buồn thay, không có khóa học được cung cấp trong trường đại học của tôi về chủ đề này và không có chuyên gia về nó (Trên thực tế, có vẻ như trường đại học của tôi không có chuyên gia về CS lý thuyết nào cả). Vì vậy, tôi không có lựa chọn để học chủ đề ngoại trừ thông qua tự học. Tôi đã trải qua một vài chương đầu tiên về độ phức tạp tính toán: Cách tiếp cận hiện đại [nhưng tôi không giải quyết bất kỳ bài tập nào (ngoại trừ hai hoặc ba trong chương đầu tiên tiết lộ vấn đề của TM và Dừng lại)]

Tôi phải đối mặt với một số vấn đề với các bài tập trong văn bản:

  1. một điều là tôi cảm thấy rằng kiểu suy nghĩ cần thiết trong sự phức tạp tính toán khá khác so với toán học mà tôi quen thuộc (Có một sự nhấn mạnh về tư duy thuật toán, v.v. và làm thế nào để giảm các vấn đề sang các vấn đề khác và tạo ra một TM mô phỏng một TM khác, v.v.) đó là điều tôi cảm thấy khó khăn.

    Có cách nào để bạn đề nghị giúp tôi phát triển mức độ trưởng thành này về các thuật toán, giảm bớt không?

  2. Một lý do khó khăn của "1" là tôi không biết nên nghiêm ngặt đến mức nào? Ví dụ, khi tôi thực hiện giảm hoặc mô phỏng, có thể tôi có thể thấy bằng trực giác rằng một cái gì đó rõ ràng và có thể được thực hiện nhưng các chi tiết sẽ rất rất tẻ nhạt để thực hiện và do đó tôi cảm thấy rằng tôi không hiểu điều này rất tốt Vấn đề là, tôi biết rằng phải có sự thỏa hiệp giữa sự nghiêm khắc và suy nghĩ trực giác. Nhưng vì tôi không có người hướng dẫn cũng như người hướng dẫn, tôi không biết dòng này nên ở đâu.

    Khi nào tôi nên thực hiện tất cả các chi tiết nếu một cái gì đó rõ ràng và khi nào tôi nên hài lòng với trực giác? Dường như có nhiều chi tiết về độ phức tạp tính toán hơn thường có trong toán học mà tôi biết và do đó, nên thỏa hiệp ở đâu?

  3. Tôi tự hỏi liệu có tồn tại bất kỳ nguồn bài tập nào không dễ hơn các bài tập được cung cấp trong độ phức tạp tính toán: Một cách tiếp cận hiện đại để tôi có thể tự rèn luyện các khái niệm cơ bản \ công trình, v.v. trước khi giải quyết các bài tập phức tạp hơn. Ngoài ra, một nguồn chứng minh (khá chi tiết) của các định lý chính sẽ rất tuyệt vời vì nhiều định lý chỉ có một bản phác thảo chứng minh trong văn bản.

Đối với nền tảng của tôi, tôi đã học các kiến ​​thức cơ bản về lập trình (tôi đã được đào tạo một thời gian về python, C và C ++) nhưng tôi không quen lắm với toán học logic toán học đặc biệt (các định lý hoàn chỉnh và không đầy đủ), tập nâng cao lý thuyết (buộc), Đại số (tuyến tính, trừu tượng, đại số phổ quát và một số lý thuyết thể loại) và cơ bản của phân tích cấu trúc liên kết và thực tế. Tôi cũng đã tham gia một khóa học về toán học rời rạc (tổ hợp + lý thuyết đồ thị).

Tôi xin lỗi nếu câu hỏi của tôi không có chủ đề nhưng tôi biết không có nơi nào tốt hơn để đề xuất những câu hỏi đó hơn ở đây.


1
1) Tôi không nghĩ câu trả lời chung cho những câu hỏi này là có thể; nó phụ thuộc vào bạn . 2) Cách của bạn vào sự phức tạp tính toán có lẽ giống như bất kỳ loại chủ đề toán học nào: thử và sai. 3) Bạn hỏi ba câu hỏi rất khác nhau, không phù hợp với trang web này. Vui lòng hạn chế một câu hỏi tại một thời điểm.
Raphael

Hãy xem M.Sipser: "Giới thiệu về lý thuyết tính toán"; nó cơ bản hơn, nhưng nó là một cuốn sách tuyệt vời.
Vor

2
đề nghị bỏ qua Trò chuyện Khoa học Máy tính theo định kỳ để biết các mẹo / khuyến khích, v.v. cũng nghĩ rằng khuyến nghị của DW bên dưới các khóa học trực tuyến là tại chỗ, chúng có sẵn, chi phí thấp miễn phí và không khác biệt đáng kể so với trải nghiệm trong lớp và một số được dạy bởi các cơ quan tốt nhất trong lĩnh vực này, v.v.; một góc độ khác là nghiên cứu các bài báo khoa học gần đây ... bạn không đề cập đến mục tiêu cuối cùng của mình, tuy nhiên, bạn có muốn vào CS như một học thuật không? v.v ... vâng, có những quy ước với bằng chứng CS, v.v. nhưng chúng có thể được chọn theo thời gian, nó không giống văn hóa toán học có những quy ước riêng của nó ...
vzn

@vzn, tôi không biết 100% nếu tôi sẽ vào CS lý thuyết như là một học thuật hay không. Nhưng có lẽ, dù sao đi nữa, nó sẽ là độ phức tạp tính toán hoặc một số chủ đề nằm giữa sự tương tác của logic toán học và độ phức tạp như độ phức tạp mô tả.
Fawzy Hegab

Câu trả lời:


7

Đề nghị của tôi là tập trung vào hai điều: điều kiện tiên quyết và thực hành.

Điều kiện tiên quyết: Sẽ khó hơn để tìm hiểu độ phức tạp tính toán mà không cần phải hiểu rõ về thuật toán. Tại nhiều trường, một lớp về thuật toán là điều kiện tiên quyết cho lớp về độ phức tạp tính toán. Bạn đề cập đến việc bạn cảm thấy bạn có thể thiếu sự trưởng thành trong các thuật toán và ở vị trí của bạn, ai sẽ không? Đó là một chủ đề không tầm thường mà bạn chưa học. Vì vậy, lời khuyên đầu tiên của tôi là: trước khi dành quá nhiều thời gian cho độ phức tạp tính toán, trước tiên hãy dành thời gian nghiên cứu các thuật toán. Có nhiều sách giáo khoa thuật toán tốt và các khóa học trực tuyến (ví dụ, thông qua Udacity, Coursera hoặc EdX). Nó có thể hữu ích để dành thời gian tìm hiểu tài liệu đó. Bạn không cần phải học mọi thuật toán trên thế giới, nhưng hãy thử cảm nhận về một số kỹ thuật thuật toán phổ biến; thiết kế giảm cơ bản là thiết kế một thuật toán, vì vậy kiến ​​thức này sẽ hữu ích. Ngoài ra, hãy đặc biệt chắc chắn rằng bạn cảm thấy thoải mái với bằng chứng về tính chính xác cho các thuật toán và phân tích thời gian chạy không có triệu chứng.

Tiếp theo, thực hành. Không ai bắt đầu với một sự trưởng thành với mức giảm. Cách để thoải mái hơn với điều đó là luyện tập - tập thể dục cho đến khi bạn cảm thấy thoải mái với tài liệu, hoặc các bài tập phát hiện ra một số khoảng cách trong sự hiểu biết của bạn (sau đó bạn có thể quay lại và tập trung vào tìm hiểu thêm). Bạn có thể không thể học các tài liệu mà không có loại thực hành này.

Để giúp bạn thực hành, có thể hữu ích khi tìm kiếm một khóa học trực tuyến (MOOC) về độ phức tạp tính toán. Bạn có thể kiểm tra Udacity, Coursera hoặc EdX.

Bạn nên nghiêm khắc như thế nào? Đủ nghiêm ngặt đến nỗi bạn tin chắc rằng bạn có thể điền vào tất cả các chi tiết nếu bạn cần (và một người bạn cùng lớp ở cấp độ nghiên cứu tương tự có thể điền vào tất cả các chi tiết mà không cần suy nghĩ kỹ - họ đồng ý điền vào các chi tiết là tẻ nhạt nhưng đơn giản và rõ ràng).


Trước hết, Cảm ơn bạn cho lời khuyên vô giá. Có một khóa học do MIT cung cấp về các thuật toán và tôi sẽ học nhưng dường như hầu hết các khóa học và văn bản trực tuyến về thuật toán đều xử lý các thuật toán liên quan đến việc sắp xếp các thứ và mảng sẽ hữu ích cho các cấu trúc dữ liệu trong lập trình sau này không phải là những thứ có liên quan đến toán học hoặc độ phức tạp tính toán (ví dụ không đề cập đến lập trình tuyến tính và đơn giản?) Bạn có nghĩ rằng một khóa học như vậy vẫn còn quan trọng? ví dụ, bạn có thể kiểm tra vui lòng khóa học trực tuyến này của MIT và cho tôi biết nếu nó sẽ hữu ích để tham gia nó
Fawzy Hegab

Đây là đường dẫn của các bài giảng của khóa học: youtube.com/playlist?list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb . Có sách giáo khoa nào bạn khuyên dùng để học thuật toán không? Trong khóa học MIT, họ sử dụng văn bản của Cormen. Bạn nghĩ sao?
Fawzy Hegab

Tôi đã tìm thấy một số khóa học về lý thuyết phức tạp. Ví dụ, có khoảng 10 bài giảng của Timoth Gowers trên web về độ phức tạp và tính toán lượng tử, tôi nghĩ chúng sẽ hữu ích mặc dù mục tiêu của ông trong lý thuyết phức tạp dường như hướng nhiều hơn đến các mạch thấp hơn không giới thiệu chủ đề cho người mới nhưng tôi nghĩ rằng tôi có thể hiểu những bài giảng liên quan đến sự phức tạp vì tôi đã đọc một vài chương đầu của văn bản Arora và Barak.
Fawzy Hegab

4

Cho rằng tôi ngược lại (học khoa học / kỹ thuật máy tính, tự học toán) Tôi nghĩ rằng tôi có thể làm sáng tỏ một số chủ đề.

Gần đây tôi đã tham gia một khóa học lý thuyết và thuật toán phức tạp bao gồm các thuật toán, ngôn ngữ chính thức và lý thuyết phức tạp. Tôi nghĩ cả 3 sẽ rất quan trọng nếu bạn muốn thực sự hiểu những gì bạn đang làm. Ví dụ: nếu bạn không hiểu ý nghĩa của big-O và cách phân tích thời gian chạy, bạn sẽ không thực sự hiểu P và NP đại diện cho điều gì và sẽ khó chuyển sang các lớp phức tạp khác. Nếu bạn không hiểu về TM, automatas, v.v., thì bạn sẽ không hiểu ngôn ngữ thông thường, CFG và những ngôn ngữ có thể quyết định và đệ quy đại diện. Vì vậy, đề xuất của tôi sẽ xuất phát từ các kết nối tôi đã thực hiện với toán học từ khoa học máy tính.

  1. Bạn đã thiết lập lý thuyết và phân tích thực tế. Bạn nên làm quen với cảm ứng từ hầu hết các khóa học của bạn (một công cụ là phần khó nhất trong phân tích thuật toán cho nhiều bạn cùng lớp) và đệ quy rất có thể sẽ tự nhiên đến với bạn. Khi nói đến các đối tượng trừu tượng hơn, trong khi không liên quan trực tiếp, tôi nghĩ rằng một cơ sở mạnh mẽ trong đại số trừu tượng (và bất cứ điều gì hơn nữa) sẽ chứng tỏ là một lợi thế rất lớn mà bạn có. Các nhóm, vòng, v.v., là các đối tượng đại số có chứa một số cấu trúc và bạn có bản đồ và hình thái giữa chúng. Máy Turing và automata là các cấu trúc tính toán có chứa một số cấu trúc và quy tắc và có các phép biến đổi giữa chúng (cấu trúc của Thompson cho các biểu thức chính quy thành NFA, TM đa băng thành một băng TM đơn).

  2. Tôi không chắc chắn những gì bạn yêu cầu cụ thể, nhưng nếu bạn có thể nghiêm ngặt, hãy làm điều đó. Có một số kỹ thuật được sử dụng trong toán học được sử dụng trong nhiều công trình (phân tích thực sử dụng bằng chứng đồng bằng epsilon xây dựng để tính toán từ các khái niệm đơn giản) và có những kỹ thuật được sử dụng trong lý thuyết phức tạp (giảm từ vấn đề này sang vấn đề khác, nghĩ về bản đồ tiêm nhiễm nơi bạn phải cung cấp bản đồ trái ngược với việc chứng minh nó là tiêm truyền).

  3. Khóa học này ( https://cifts.engr.illinois.edu/cs374/lectures.html ) cung cấp ghi chú bài giảng và slide và có tài liệu tham khảo giới thiệu tuyệt vời. Không có cách nào bao gồm tất cả mọi thứ, nhưng nó có thể là một khởi đầu tuyệt vời cho bạn. Công việc trong phòng thí nghiệm khá đẹp để xem xét và kiểm tra sự hiểu biết của bạn, nhưng thường thì nó khó hơn kiến ​​thức cần thiết.

Cuối cùng, toán học rời rạc của bạn sẽ giúp ích rất nhiều trong suốt thời gian này. Bạn sẽ thấy lý thuyết đồ thị quan trọng như thế nào trong phân tích và thiết kế thuật toán cũng như tổ hợp để phân tích cấu trúc dữ liệu. Chúc may mắn và tôi hy vọng bạn tìm thấy những gì bạn đang tìm kiếm!


Cảm ơn bạn cho lời khuyên tuyệt vời. Tôi tự hỏi, làm thế nào lý thuyết thể loại sẽ giúp tôi nhiều hơn?
Fawzy Hegab

Tôi cũng thích điều đó, vì vậy tôi sẽ cho bạn biết khi tôi tìm hiểu!
m1cky22

1

Tôi sẽ đề nghị bạn (a) xác định toán học tiên quyết nào bạn cần, (b) bám sát thực sự hiểu và trải qua 3-4 vấn đề đầu tiên hoặc lâu hơn trong mỗi chương, hãy tin tôi ngay cả khi chúng mất nhiều thời gian, bạn sẽ hiểu được sau đó khá nhanh với các vấn đề trong tương lai.

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.