Khoa học máy tính lý thuyết tài nguyên tự học cho lập trình viên


14

Tôi là một kỹ sư phần mềm khá thành thạo, nhưng tôi không biết nhiều về lý thuyết. Tôi muốn học thêm lý thuyết. Các chủ đề đặc biệt mà tôi quan tâm là: độ phức tạp tính toán, ngôn ngữ chính thức và lý thuyết loại. Nhưng tôi không biết làm thế nào để bắt đầu tìm hiểu về các lĩnh vực này.

Những tài nguyên nào bạn muốn giới thiệu cho ai đó muốn tìm hiểu thêm lý thuyết thông qua tự học? Có bất kỳ hướng dẫn tự nghiên cứu khoa học máy tính cho các kỹ sư phần mềm?


3
Nó phụ thuộc vào những gì bạn muốn tìm hiểu về. Arora-Barak giới thiệu kỹ lưỡng về lý thuyết phức tạp tính toán (và có sẵn miễn phí trên mạng). Vì vậy, đó là một nơi tốt để bắt đầu.
Thomas hỗ trợ Monica

4
Bạn đã tham gia các khóa học lý thuyết tại trường cao đẳng / đại học như cấu trúc dữ liệu, thuật toán, v.v.? Nếu bạn chưa tham gia các khóa học lý thuyết đại học thường yêu cầu thì sách giáo khoa cho các khóa học đó sẽ là điểm khởi đầu tốt. Sau đó, bạn có thể xem các bài viết trên wikipedia, danh sách sáchdanh sách video , các khóa học trực tuyến của chúng tôi tại Coursera / Udacity / EdX / ... Coursera có các khóa học lý thuyết khá hay.
Kaveh

Bạn đã học gì ở trường đại học?
Omar Shehab

Những loại ngôn ngữ nào bạn lập trình trong? Phần lớn CS lý thuyết có thể được học song song với một cái gì đó cụ thể. Chẳng hạn, nếu bạn muốn tìm hiểu thêm về các ngôn ngữ chính thức, các ngôn ngữ / biểu thức thông thường (ví dụ như regrec) là một nơi tốt để bắt đầu như tìm hiểu về trình biên dịch. Đối với lý thuyết loại, bạn có thể muốn chơi với một ngôn ngữ được nhập tĩnh như haskell, F # hoặc ML.
Rồng con

hãy thử New Turing Omnibus của Dewdney như một phần giới thiệu / khảo sát / giới thiệu rộng. xem thêm sách khoa học pop truyền cảm hứng cho TCS
vzn

Câu trả lời:


7

Đó là một lĩnh vực rộng với một vài khu vực khá khác nhau.

Tôi sẽ bắt đầu với một số ý tưởng cơ bản nhất về máy tính là gì: Hopcroft và Ullman, "Giới thiệu về Lý thuyết tự động, Ngôn ngữ và Tính toán."

Lý do tôi khuyên bạn nên đặc biệt, là sự nhấn mạnh của họ vào bằng chứng. Họ hướng dẫn bạn thông qua một cách suy nghĩ nghiêm ngặt. Đó là sự khác biệt giữa viết chương trình và khoa học.


1
Cảm ơn! Tôi không biết điều này có thay đổi gì không, nhưng tôi thực sự có một số nền tảng về toán học dựa trên bằng chứng (có lẽ tôi nên đề cập đến điều đó trong câu hỏi). Tôi đã thực hiện phân tích thực dựa trên bằng chứng, cấu trúc liên kết điểm và đại số trừu tượng.
Henry H.

Sau đó, bạn sẽ có thể xử lý nó rất nhanh :)
Kate F

là một sự khác biệt nhưng không phải sự khác biệt CS đòi hỏi nhiều nguyên tắc khác, v.v.
vzn

Tôi không nghĩ rằng nhu cầu về sự nghiêm ngặt thực sự là một sự khác biệt giữa lập trình và toán học. Lập trình và chứng minh các định lý là những nhiệm vụ rất liên quan (xem Curry-Howard Isomorphism), và hầu như không có nhiệm vụ phi toán học nào đòi hỏi sự khắt khe hơn lập trình. Trình biên dịch ít tha thứ hơn về lỗi so với người đọc bằng chứng.
Jan Johannsen

2
@JanJohannsen Tôi khá không đồng ý - ví dụ: xem Hành vi không xác định cho C.
Kate F

9

Có một số cách để tìm hiểu về lý thuyết loại. Đối với một lập trình viên làm việc, Các loại và Ngôn ngữ lập trình của B. Pierce là một khởi đầu tốt. Nền tảng thực tiễn cho ngôn ngữ lập trình của R. Harper cũng có thể tốt. Nếu bạn muốn có một chút nền tảng dễ đọc về ngữ nghĩa hoạt động, tôi khuyên bạn nên sử dụng ngữ nghĩa chính thức của ngôn ngữ lập trình của G. Winskel : Giới thiệu . Với T. Nipkow, G. Klein, ngữ nghĩa cụ thể, một biến thể của cuốn sách của Winskel đã được chính thức hóa cho trợ lý chứng minh tương tác của Isabelle / HOL. Tôi nghi ngờ rằng thật khó để hiểu được một người hoạt ngôn chỉ từ cuốn sách này (hoặc bất kỳ), bạn muốn một chuyên gia gần đó đặt câu hỏi. Nếu bạn muốn có một cách tiếp cận toán học hơn đối với lý thuyết loại, bạn có thể xem JR Hindley, JP Seldin, Lambda- Compus và Combinators: Giới thiệu , hoặc H. Barendregt, Lambda Compi với các loại . Mặc dù tôi không khuyên bạn nên bắt đầu từ Barendregt.

Nếu bạn muốn có một đề xuất duy nhất, tôi muốn nói rằng hãy đọc tất cả Pierce ngoại trừ Phần VI (Hệ thống bậc cao) và triển khai các ngôn ngữ đồ chơi mà cuốn sách thảo luận. Bạn sẽ kết thúc với một nền tảng vững chắc trong lý thuyết loại, và có lẽ cũng là một lập trình viên tốt hơn.


2

Tôi đề nghị Khả năng tính toán, Độ phức tạp và Ngôn ngữ của Martin Davis, Ron Sigal và Elaine Weyuker.


Đó là một cuốn sách đẹp cho TCS cũ. Ngoại trừ một phần của ngữ nghĩa lý thuyết miền, có thể bỏ qua.
Martin Berger

1

Tôi là fan hâm mộ lớn của Lý thuyết và Thuật toán. Tôi đã có một lần có cơ hội đến thăm Khoa học máy tính lý thuyết tại Viện Công nghệ Ấn Độ, Madras (IIT-M), Ấn Độ. Tôi đã biết về rất nhiều nhà lý thuyết tại IIT-M. Khi tôi đến đó tôi không có ý tưởng gì về Lý thuyết là gì, nhưng hôm nay tôi hoàn toàn thích nó.

Cảm ơn @Kate F cho con trỏ, vâng Hopcroft và Ullman là một nơi tuyệt vời để bắt đầu.

Tuy nhiên đây là cách tôi đã bắt đầu,

  1. Đọc phần Giới thiệu về Thuật toán của Cormen. <\ Br> Đây là một nơi tuyệt vời để bắt đầu. Khi bạn học hãy cố gắng hiểu từng bằng chứng càng dài càng tốt. Nếu bạn hiểu rõ bằng chứng, hãy thử viết mã logic tương tự trong bất kỳ ngôn ngữ nào bạn chọn. (Mất một chút thời gian nhưng nó đáng để thử)

  2. Thực hiện theo các hội nghị hàng đầu trong lý thuyết như
    FOCS
    SODA
    STOC
    EC (Thương mại điện tử) - Thuật toán Lý thuyết trò chơi
    COLT (Hội thảo về Lý thuyết Learning) - Học thuyết
    CRYPTO - Cryptography
    SOCG (Symposium trên Computational Geometry) - Computational Geometry
    CCC (Hội nghị Độ phức tạp tính toán) - Lý thuyết phức tạp

Ngay cả khi bạn không hiểu nhiều hãy cố gắng đọc và NGHINK càng nhiều càng tốt. Bạn phải làm càng nhiều bằng chứng càng tốt ..

  1. Đây là một nơi tuyệt vời để xem xét nếu bạn đang nghĩ về độ phức tạp tính toán nói riêng ( Đây là từ Stanford ).
  2. Theo giáo sư Sanjeev Arora, Boaz Barak, Jelani Nelson, Madhu Sudan
  3. Dưới đây là tập hợp các thông tin tổng hợp trong lĩnh vực Độ phức tạp tính toán
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.