Tôi nên biết những khái niệm Khoa học Máy tính nào? [đóng cửa]


94

Bạn nghĩ khái niệm nào trong Khoa học Máy tính đã giúp bạn trở thành một lập trình viên giỏi hơn?

Bằng cấp của tôi là Kỹ sư cơ khí nên sau khi trở thành một lập trình viên, tôi hơi thiếu kiến ​​thức cơ bản. Có một vài khái niệm CS tiêu chuẩn mà tôi đã học gần đây đã giúp tôi hiểu sâu hơn về những gì tôi đang làm, cụ thể là:

Tính năng ngôn ngữ

  • Con trỏ & Đệ quy (Cảm ơn Joel!)

Cấu trúc dữ liệu

  • Danh sách được Liên kết
  • Hashtables

Thuật toán

  • Sắp xếp bong bóng

Rõ ràng, danh sách hiện tại hơi ngắn vì vậy tôi hy vọng sẽ có những gợi ý về:

  1. Những khái niệm tôi nên hiểu,
  2. Bất kỳ nguồn tài liệu tốt nào để hiểu đúng về chúng (vì Wikipedia đôi khi có thể hơi dày đặc và mang tính học thuật).

5
Các loại bong bóng? Tránh xa chúng càng xa càng tốt! Thay vì tìm hiểu cách thức hoạt động của quicksort / heapsort.
Carra

18
Có học bong bóng. Tìm hiểu lý do tại sao khủng khiếp của nó. Tìm hiểu quicksort, merge, và tất cả những thứ còn lại, bao gồm cả những điểm yếu riêng của chúng. Nhưng đừng viết chúng bằng mã sản xuất: hãy gọi các hàm sắp xếp được cung cấp bởi bất kỳ nền tảng nào bạn đang sử dụng.
Brian Ensink

@Roger Pate - +1 cho bạn, một người nên biết thuật toán hoặc cấu trúc dữ liệu tốt cho điều gì và nó hấp dẫn ở điểm nào. Cả Quicksort và Bubblesort đều có cùng hiệu suất trường hợp xấu nhất [O (n ^ 2)], nhưng đối với các loại đầu vào rất khác nhau và Bubblesort có hiệu suất trường hợp tốt nhất là O (n), trong đó QS vẫn là O (n log n). Tất nhiên, nếu bạn đang xem xét Bubblesort thì thay vào đó, bạn có thể muốn chuyển sang loại Chèn.
Andre Artus

Câu trả lời:


60

Hãy xem bài đăng trên blog này của Steve Yegge (trước đây thuộc Amazon, nay thuộc Google):

Nó đi sâu vào một số chi tiết về năm khái niệm quan trọng nhất mà các nhà phát triển cần phải biết:

  1. Lập trình cơ bản (bao gồm đệ quy, I / O tệp, đầu ra được định dạng, vòng lặp, v.v.)
  2. Thiết kế hướng đối tượng (bao gồm các mẫu thiết kế, v.v.). Bạn sẽ có thể tạo ra các thiết kế OO hợp lý cũng như hiểu các khái niệm.
  3. Viết kịch bản và regexes.
  4. Cấu trúc dữ liệu - danh sách, tập hợp, bảng băm, cây, đồ thị, v.v. - cũng như ký hiệu Big O và độ phức tạp của thuật toán.
  5. Bit, byte và số nhị phân - cách các số được biểu diễn trong máy tính và cách thao tác chúng.

Liên kết đẹp. Một chút tập trung vào phía unix, (thiếu hoàn toàn .NET) nhưng vẫn tốt.
Toon Krijthe

Liên kết tuyệt vời - có rất nhiều thứ ở đó để tôi làm việc, tôi chỉ ước nó có một số liên kết đến các trang tốt giải thích những điều đó.
Jon Artus

Liên kết sẽ rất hữu ích để tôi kiểm tra bản thân và nắm bắt các nguyên tắc cơ bản. Cảm ơn ..
rpr

Đồng ý, liên kết tuyệt vời. Trong khi nhiều giải pháp khả thi được xác định là dựa trên Unix, các khái niệm tổng thể liên quan rất bất khả tri về ngôn ngữ / nền tảng. Đối với hầu hết các lập trình viên, những thứ như đệ quy, viết ADT chẳng hạn như cây, và các hoạt động bitwise là khá hiếm nhưng chúng là một nền tảng quan trọng.
Zach Burlingame

4
Tôi đồng ý với mọi thứ ngoại trừ regexes. Đó là một phần thưởng tuyệt vời, nhưng hầu hết mọi thứ đều là những điều cơ bản ở mức cơ bản, nền tảng mà mọi thứ được xây dựng ... regexes rất tuyệt vời, nhưng tôi biết rất nhiều lập trình viên tuyệt vời không bao giờ sử dụng chúng và không bao giờ cần.
Beska

35

Bạn chắc chắn nên hiểu được Big-O ký hiệu và Big-O ước tính của các thuật toán - đó là những gì, làm thế nào nó được sử dụng, lý do tại sao điều quan trọng là, làm thế nào bạn so sánh hai thuật toán được ước tính Big-O của họ, làm thế nào bạn xây dựng Big-O ước tính cho các thuật toán đơn giản.


1
Bạn có thể bắt đầu với một bài viết trên Wikipedia mà tôi đã liên kết - nó khá đơn giản và chính xác về mặt toán học.
sharptooth

3
Bạn phải có một quan điểm khá thấp về toán cao cấp. Tôi hiểu điều này trong năm đầu tiên đại học, khi tôi mới chỉ học một phần của phép tính.
GoatRider

1
Đừng quên khái niệm NP và khi có vấn đề bên trong nó, một nhà phát triển cố gắng viết mã TSP (Traveling Salesman) vào mỗi giao dịch cơ sở dữ liệu cho mục đích tìm kiếm hoặc một số vấn đề khác là một vấn đề lớn =]
Ed James

2
Bạn cũng nên biết rằng O lớn không cho bạn biết thuật toán nào tốn ít thời gian hơn. Một cái gì đó hầu hết các sinh viên tốt nghiệp CS không nắm bắt
Martin Beckett

3
Nó giống như vậy. Nó cho bạn biết cái nào có trường hợp xấu nhất tốt nhất, không nhất thiết cái nào 'nhanh hơn' vì điều đó phụ thuộc vào bộ đầu vào.
Ed James

30

Mình thấy hơi buồn cười là bạn đang tìm các môn khoa học máy tính mà thấy wikipedia hàn lâm quá: D

Dù sao, ở đây tiếp tục, không theo thứ tự cụ thể:


2
+1 bởi vì bạn đã đề cập đến cơ sở dữ liệu, thường bị bỏ qua trong các loại danh sách này nhưng một khái niệm rất quan trọng đối với bất kỳ sinh viên tốt nghiệp CS hoàn thiện nào cần biết.
Brian Ensink

14

Một số khái niệm đã giúp tôi phát triển (trí tuệ và mã):

  • Lexing, Phân tích cú pháp, So khớp chuỗi, Regex
  • Ghi nhớ
    • đóng gói / phạm vi / đóng cửa
    • bộ nhớ đệm
  • Đệ quy
  • Trình tạo lặp / Trình tạo
  • Lập trình hàm - Bài báo tuyệt vời của John Hughes đã cho tôi biết "tại sao"

Đây là toàn bộ các lĩnh vực của toán học rời rạc, nhưng cần có một giới thiệu nghiêm túc cho CS:

  • Ma trận / Đại số tuyến tính
  • Lý thuyết đồ thị

Mặc dù các bài giảng và bài báo của Mark Jason-Dominus thường hướng đến các hacker Perl, tôi nghĩ rằng bất kỳ lập trình viên nào cũng sẽ được hưởng lợi từ phần trình bày rõ ràng và mã thực của anh ấy, đặc biệt là trong Higher Order Perl .


10

Tôi có thể nói ngày nay sự hiểu biết về Lập trình hướng đối tượng là điều bắt buộc, ngay cả khi bạn không cần sử dụng nó hàng ngày.

Từ điều này, tôi cũng sẽ nói rằng việc hiểu các mẫu phổ biến nhất cũng có thể hữu ích.


10

Tôi thấy một số khái niệm CS tốt đã được xác định nhưng ít nói về Toán học.

Tôi đề nghị bạn nên nhìn vào toán học rời rạc . Nó có một loạt các vấn đề hữu ích bắt đầu với các chứng minh logic giúp bạn viết các điều kiện trong mã. Lý thuyết đồ thị và tổ hợp cũng giúp giải quyết các vấn đề phức tạp và tối ưu hóa thuật toán.

Trong khi chúng ta học về chủ đề toán học, đại số tuyến tính thường là điều kiện tiên quyết cho các lớp đồ họa máy tính nâng cao.


1
Nếu tôi chỉ phải chọn một thì nó sẽ là toán học rời rạc. Đó là khá nhiều CS 101. Tôi rất khó nghĩ ra một khu vực hoặc mô hình trong lập trình nói chung mà DM không đụng đến theo một cách nào đó.
Andre Artus

6

Ma trận năng lực lập trình viên đã đề cập chi tiết vấn đề này, nhưng tôi sẽ nhấn mạnh một vài điều sau:

  • Cấu trúc dữ liệu
    • Cấu trúc dữ liệu nâng cao như B-tree, nhị thức và fibonacci heaps, AVL / Red Black tree, Splay Trees, Skip Lists, try, v.v.
  • Thuật toán
    • Cây, Đồ thị, các thuật toán tham lam và chia và chinh phục đơn giản, có thể hiểu được mức độ phù hợp của các cấp độ của ma trận này.
  • Lập trình hệ thống
    • Hiểu toàn bộ ngăn xếp lập trình, phần cứng (CPU + Bộ nhớ + Bộ nhớ đệm + Ngắt + vi mã), mã nhị phân, hợp ngữ, liên kết tĩnh và động, biên dịch, thông dịch, biên dịch JIT, thu gom rác, đống, ngăn xếp, định địa chỉ bộ nhớ…
  • Kiểm soát phiên bản mã nguồn
    • Kiến thức về hệ thống VCS phân tán. Đã dùng thử Bzr / Mercurial / Darcs / Git
  • Tự động hóa xây dựng
    • Có thể thiết lập tập lệnh để xây dựng hệ thống và cả tài liệu, trình cài đặt, tạo ghi chú phát hành và gắn thẻ mã trong kiểm soát nguồn
  • Kiểm tra tự động
    • Hiểu và có thể thiết lập các bài kiểm tra chức năng, tải / hiệu suất và giao diện người dùng tự động
  • Sự cố phân rã
    • Sử dụng cấu trúc dữ liệu và thuật toán thích hợp và đưa ra mã chung / hướng đối tượng để đóng gói các khía cạnh của vấn đề có thể thay đổi.
  • Hệ thống phân hủy
    • Có thể hình dung và thiết kế các hệ thống phức tạp với nhiều dòng sản phẩm và tích hợp với các hệ thống bên ngoài. Cũng nên có khả năng thiết kế các hệ thống hỗ trợ hoạt động như giám sát, báo cáo, kiểm tra lỗi, v.v.

5

Tôi thấy đồ thị và một số thuật toán áp dụng như độ sâu trước tiên, tìm kiếm hơi thở đầu tiên, đường đi ngắn nhất, v.v. rất hữu ích. Hướng đối tượng cũng là một khái niệm thực sự phổ biến.


4

Quy tắc 1: Phần mềm là Nắm bắt kiến ​​thức . Phần mềm có nghĩa là một cái gì đó. Nếu bạn không rõ nghĩa, hãy dành nhiều thời gian hơn để nói chuyện với người dùng để hiểu họ làm gì.

Thuật toán và Cấu trúc dữ liệu là hai mặt của cùng một đồng tiền. Thuật toán phụ thuộc vào cấu trúc dữ liệu, cấu trúc dữ liệu phụ thuộc vào thuật toán.

Bỏ học loại bong bóng càng nhanh càng tốt. Nghiêm túc. Tất cả các ngôn ngữ hiện đại (Java, Python, v.v.) đều có các lớp bộ sưu tập triển khai kiểu sắp xếp tốt hơn kiểu sắp xếp bong bóng. Hoàn toàn không có trường hợp nào mà bạn nên sử dụng sắp xếp bong bóng cho bất cứ điều gì. Bạn nên tìm kiếm một lớp tập hợp bao gồm một phương thức sắp xếp. Tốt hơn, bạn nên tìm kiếm một thuật toán tránh sắp xếp hoàn toàn.

Bạn phải học một số ngôn ngữ.

  • Ngôn ngữ lập trình (Java, Python, v.v.)

  • Ngôn ngữ hệ vỏ.

  • Ngôn ngữ cơ sở dữ liệu (SQL)

  • Ngôn ngữ trình bày (HTML và CSS)

  • Các ngôn ngữ biểu diễn dữ liệu khác (XML, JSON)

Bạn phải học một số cấu trúc dữ liệu.

  • Chuỗi (danh sách, bộ dữ liệu, tệp)

  • Phân cấp (như tài liệu XML và HTML, cũng như hệ thống tệp cơ bản)

  • Quan hệ (như cơ sở dữ liệu và hệ thống tệp với các liên kết cứng và mềm được đưa vào)

  • Bản đồ (hoặc Chỉ mục hoặc Mảng liên kết) bao gồm Bản đồ băm và Bản đồ cây

  • Bộ

Cộng với một số phân tích độ phức tạp thuật toán. Đôi khi được gọi là "Big O". Tại sao sắp xếp bong bóng là xấu vì nó là O ( n ^ 2), trong đó một sắp xếp nhanh là O ( n log n ).


Đối với hồ sơ, tôi thực sự không bao giờ sử dụng sắp xếp bong bóng! Tôi chỉ thấy việc học cách hoạt động của nó là một trải nghiệm thú vị và nhận ra rằng có một vài thuật toán khác như vậy mà mọi người nên hiểu đủ để viết bằng ngôn ngữ họ chọn.
Jon Artus

Có vô số thuật toán. Hầu hết chúng đều xấu. Một số trong số họ tốt. Bubble Sort đơn giản là không tốt. Mua BẤT KỲ cuốn sách nào về thuật toán và tiếp tục.
S.Lott

Chỉ là chọn nit, nhưng Quicksort là trường hợp xấu nhất O (n ^ 2). Tôi chỉ nêu ra vì tôi nghĩ hiểu tại sao điều này đúng là một bài tập giáo dục có giá trị khi nghiên cứu các thuật toán cơ bản.
Brian Ensink

Đối với quicksort, có - một bài tập quan trọng. Đối với sắp xếp bong bóng, điều duy nhất là xem nó thực sự tồi tệ như thế nào của một thuật toán. Nhìn chung, hiểu được trường hợp điển hình và trường hợp xấu nhất là rất quan trọng.
S.Lott

4

Vâng, hộp của giun đã được mở ngay bây giờ! :)
Tôi bắt đầu từ ngành Kỹ thuật điện.

Thiết kế cơ sở dữ liệu quan hệ: Theo dõi dữ liệu giống như Arnold trong "Kindergarden Cop".
Nó có thể là hỗn loạn hoàn toàn. Nó phải được kiểm soát.
Cách giữ dữ liệu của bạn ở ít vị trí nhất, với ít thông tin trùng lặp nhất. Cách giữ cho dữ liệu của bạn nhẹ nhàng và dễ dàng truy cập. Cách kiểm soát sự tăng trưởng và tính toàn vẹn của dữ liệu.

Thiết kế Giao diện Người dùng (UI): Đây là cách Người dùng phải truy cập vào dữ liệu mà chúng tôi đang theo dõi.
Hầu hết các giao diện người dùng được thiết kế bởi các nhà phát triển. Do đó, hầu hết các giao diện người dùng, thật không may, song song với thiết kế cơ sở dữ liệu. Người dùng hoàn toàn không quan tâm đến thiết kế dữ liệu. Đơn giản là họ muốn, những gì họ muốn. Họ muốn lấy nó một cách dễ dàng. Thông thường, điều này đòi hỏi sự tách biệt lớn khỏi thiết kế dữ liệu và Giao diện người dùng. Học cách tách biệt "kỹ thuật" bạn với "lòng hiếu khách phương Nam".

Lập trình hướng đối tượng: Nhiều ngôn ngữ sử dụng định dạng này.

Xử lý song song - Đa luồng: Nhiều bộ xử lý giúp công việc nhanh chóng!
Máy tính song song đã tồn tại trong nhiều thập kỷ. Họ đã ở trên máy tính để bàn của chúng tôi một thời gian. Với sự kiện "điện toán đám mây", xử lý song song lớn không chỉ là bắt buộc mà còn được ưu tiên hơn. Nó vô cùng mạnh mẽ! Có rất nhiều tiềm năng việc làm cho các nhà phát triển song song.

Hiểu các Quy tắc Kinh doanh: Điều này giúp bạn thực hiện rất nhiều logic của mình, dựa trên bảng.
Nhiều điều kiện IFblock có thể nằm trong bảng quy tắc kinh doanh. Để thay đổi logic, chỉ cần thay đổi thông tin trong bảng. Ít / Không giải mã. Ít / Không biên dịch lại.

Giám sát sự kiện ... Các phương pháp thực hiện công việc:
Giữ mọi thứ riêng biệt trong mã của bạn. Nó giúp những người khác cập nhật dễ dàng hơn trong tương lai. Nó cũng tương đồng với khuôn khổ Model / View / Controller (MVC).

PJ


3

Đối với tôi, tôi nhận được rất nhiều điều từ khóa học sau tại varsity

  • Quản lý dự án
  • Tương tác với máy tính của con người (Giúp chúng tôi chuyên gia tạo ra màn hình thân thiện với người dùng hơn)
  • Thiết kế cơ sở dữ liệu (Bao gồm cách cơ sở dữ liệu hoạt động, nhật ký giao dịch, khóa, v.v.)
  • Kho dữ liệu
  • Đồ họa (OpenGL)
  • Thuật toán nâng cao
  • Cấu trúc dữ liệu

Những điều tôi ước mình đã làm ở varsity

  • Xây dựng trình biên dịch
  • Mẫu thiết kế
  • Lý thuyết tự động hóa

3

LOGIC - Tôi chỉ nói quá tầm quan trọng của logic trong lập trình. Bạn nói rằng bạn đã học Kỹ thuật cơ khí nên bạn phải biết toán học có thể giúp cuộc sống của bạn dễ dàng hơn bao nhiêu.

Mệnh đề logic , first-order logic , Second-Order logic : đây là những công cụ rất mạnh mẽ. Có lẽ là điều quan trọng nhất (và duy nhất) mà tôi đã học được ở trường đại học. Logic giống như khẩu pháo hạng nặng của một lập trình viên - rất nhiều vấn đề rất phức tạp (cũng như những vấn đề ít phức tạp hơn) trở nên đơn giản hơn nhiều khi bạn đã đưa chúng vào một dạng logic có tổ chức. Nó giống như những gì Đại số tuyến tính dành cho Kỹ sư cơ khí.


3

Tôi nghĩ rằng bạn cần hiểu rõ về cách thức hoạt động của trình biên dịch. Aho có cuốn sách kinh điển về các khái niệm được sử dụng trong việc tạo trình biên dịch. Tiêu đề là Trình biên dịch: Nguyên tắc, Kỹ thuật và Công cụ. Biệt danh của nó là Sách Rồng. Để thực sự hiểu cuốn sách đó, bạn nên hiểu về các ngôn ngữ chính thống. Hopcroft có một cuốn sách hay về điều đó - Giới thiệu về lý thuyết, ngôn ngữ và tính toán tự động dữ liệu.



2

Rất nhiều phản hồi tốt đã được đề cập ở đây, nhưng tôi muốn thêm một tập hợp con của những gì quan trọng, nhưng vẫn chưa được đề cập cho đến nay.

Sau 15 năm phát triển Phần mềm chuyên nghiệp sau đại học, tôi nhận thấy rằng tôi thường xuyên sử dụng một số khái niệm sau đây từ thời đi học:

  • Khái niệm OO chung và các tính năng của ngôn ngữ lập trình hiện đại (lớp, ẩn dữ liệu, v.v.).
  • Số liệu hiệu suất thuật toán (ký hiệu Big O). Khi thiết kế một thuật toán, thực hiện phân tích Big O để xác định chi phí của thuật toán và xem xét các giải pháp thay thế hiệu quả hơn trong các khu vực tắc nghẽn.
  • Danh sách được liên kết và các cấu trúc dữ liệu phức tạp khác.
  • Phân loại nhanh và các khái niệm phân loại khác nhau.
  • Cây và thao tác trên cây nhanh.

Nếu ngôn ngữ / nền tảng của bạn không hỗ trợ Thu gom rác, việc phân bổ và dọn dẹp bộ nhớ là rất quan trọng và sẽ được thêm vào danh sách.


2

Tôi ủng hộ Toán rời rạc. Khoa học máy tính là sự trừu tượng. học cách suy nghĩ như một nhà Toán học là rất hữu ích.

Tôi cũng muốn thêm vào những gì S.Lott đã nói về ngôn ngữ. Học nhiều LOẠI ngôn ngữ cũng rất quan trọng. Không chỉ biên dịch so với kịch bản. Nhưng chức năng (ML, Lisp, Haskell) hướng đối tượng logic (Prolog) (C ++, Java, Smalltalk) bắt buộc (thậm chí C, Pascal, FORTRAN).

Bạn càng biết nhiều mô hình lập trình, bạn càng dễ dàng chọn ngôn ngữ mới khi ngôn ngữ mới hấp dẫn xuất hiện!


2

Một số khái niệm về hệ điều hành

 ( memory, IO, Scheduling, process\Threads, multithreading )

[một cuốn sách hay " Hệ điều hành hiện đại , tái bản lần thứ 2, Andrew S. Tanenbaum"]

Kiến thức cơ bản về mạng máy tính

[một cuốn sách hay của Tanenbaum

Khái niệm OOPS

Autometa hữu hạn

Một ngôn ngữ lập trình (đầu tiên tôi học C rồi đến C ++)

Thuật toán (độ phức tạp thời gian \ không gian, sắp xếp, tìm kiếm, cây, danh sách liên kết, ngăn xếp, hàng đợi)

[một cuốn sách hay Giới thiệu về Thuật toán ]


meta tự động? - chắc chắn là "automata" theo lần chỉnh sửa đầu tiên.
Tom Duckering

Giáo sư! tôi đoán là sa lầy để kiểm tra chính tả. Tôi sẽ sửa lại. Cảm ơn.
aJ.


1

Cố gắng hiểu tất cả các cấp độ của lập trình. Từ cấp thấp nhất (lắp ráp) đến cấp cao nhất.

Lấy ví dụ về đệ quy, đây là một tính năng dễ thực hiện :) Cố gắng học hợp ngữ và tạo một chương trình sử dụng đệ quy trong hợp ngữ.


1

Các thuật toán.

Học cách sử dụng ngôn ngữ lập trình theo cách thuần thục là điều bạn có thể học ngay khi tiếp tục, nhưng hầu như không thể tự mình phát minh ra tất cả các Thuật toán được sử dụng rộng rãi .. Ít nhất một người thực sự nên nhận thức được những gì có thể và không thể làm được với một số vấn đề.

Ví dụ, người ta chỉ đơn giản là không thể viết một số chương trình với sắp xếp bong bóng và mong đợi nó được coi là tốt, cho dù mã có tốt đến đâu.

Tóm lại - hãy xem phần Giới thiệu về thuật toán

Không cần phải làm chủ nó, chỉ cần biết những gì đang xảy ra ...


1

Là một sinh viên gần đây tốt nghiệp bằng khoa học máy tính, tôi muốn giới thiệu những điều sau:


1

Đó rõ ràng là sự hiểu biết tốt về Lập trình hướng đối tượng, các nguyên tắc hướng dẫn tốt như Nguyên tắc SOLID và tuân theo các mẫu và thực hành đã được thiết lập.

Nếu bạn nhìn vào SOA, hoặc DDD, tất cả cuối cùng đều rơi vào một số dạng khái niệm OOP.

Tôi muốn khuyên bạn nên mua một số sách OOP hay và chọn một ngôn ngữ phong phú như C # hoặc Java để bắt đầu

OOP của Grady Booch

(PHP, các bạn ruby ​​vui lòng không bỏ phiếu cho tôi, tôi chỉ đưa ra một số ví dụ để anh ấy bắt đầu, bạn có thể cung cấp câu trả lời và đề xuất của riêng mình tại đây)



1

Tôi sẽ không cho bạn biết bất kỳ khái niệm cụ thể nào để nghiên cứu, nhưng thay vào đó tôi sẽ khuyên bạn nên đọc nhiều về một loạt các chủ đề. Đừng lo lắng về việc hiểu sâu về từng chủ đề bạn đọc - tại thời điểm này, điều quan trọng hơn là bạn có thể nhận ra loại vấn đề mà bạn đang xem xét, để bạn có thể thực hiện một số vấn đề- trong thời gian nghiên cứu khi bạn thực sự đối mặt với nó. Nói cách khác, bạn không biết cách giải bài toán tổ hợp cũng không sao, miễn là bạn biết đủ để tra cứu "tổ hợp" khi bạn cần xem có bao nhiêu cách bạn có thể sắp xếp một tập hợp các đối tượng hoặc chọn một tập hợp con .

Wikipedia là một tài nguyên khá tốt cho kiểu duyệt trên phạm vi rộng này, đặc biệt nếu bạn mới bắt đầu lướt qua. Thậm chí còn tốt hơn, đặc biệt nếu bạn thấy Wikipedia quá hàn lâm hoặc không thể truy cập được, là wiki C2 . (Đây là, thú vị đủ, các wiki gốc phát minh bởi Ward Cunningham).


0

Tôi nghĩ điều cần thiết là phải hiểu lý thuyết cơ bản đằng sau đa luồng, nếu không có điều này thì rất khó để nhận ra rằng có thể có vấn đề, cho đến khi bạn gỡ lỗi trên máy chủ trực tiếp lúc 4 giờ sáng chủ nhật.

Semaphores, phần và sự kiện quan trọng.


0

Không, không phải sắp xếp bong bóng, nhanh chóng. Đó là thứ-O thứ - sắp xếp bong bóng trung bình là O (n ^ 2), nhanh chóng là O (n * log (n)).


0

Tôi sẽ nói dưới đây là những thứ quan trọng nhất

  • Lập trình hướng đối tượng
  • Khái niệm hệ điều hành
    • Quy trình và Chủ đề
    • Lập lịch thuật toán
  • Cấu trúc dữ liệu
    • Loại lưu trữ và thu thập dữ liệu, các loại (danh sách liên kết, băm, mảng, v.v.)
    • Giải thuật sắp xếp
    • Độ phức tạp của thuật toán

Sau đó, chuyển đến nội dung liên quan đến ngôn ngữ cụ thể. Tôi hy vọng điều này là hữu ích!!


0

Tôi sẽ bắt đầu với câu trích dẫn:

"nếu công cụ duy nhất bạn có là một cái búa, bạn coi mọi thứ như một cái đinh". (Abraham Maslow)

Nguyên tắc quan trọng nhất, IMO, là phải biết nhiều mô hình, ngôn ngữ lập trình khác nhau và hiểu rõ về các công cụ theo ý bạn. Mọi vấn đề đều có thể được giải quyết bằng hầu hết mọi ngôn ngữ bạn chọn, có thể là ngôn ngữ chính thống hoàn chỉnh với thư viện mặc định khổng lồ hoặc ngôn ngữ chuyên biệt nhỏ như AutoHotKey. Công việc đầu tiên của lập trình viên là xác định những gì cần sử dụng theo đặc điểm kỹ thuật của bài toán. Một số khái niệm cung cấp cách tiếp cận chủ đề tốt hơn, bất kể mục tiêu chính của bạn có thể là gì - sự tinh vi, xáo trộn, hiệu suất, tính di động, bảo trì, kích thước mã nhỏ ...

Nếu không, bạn sẽ hoàn thành giống như một số lập trình viên cố gắng tuyệt vọng làm điều gì đó bằng 1 ngôn ngữ mà họ chuyên sâu, trong khi vấn đề có thể rất nhỏ để giải quyết trong bối cảnh lập trình khác nhau.

Lời khuyên này đi cùng với xu hướng ngày nay đối với các dự án đa ngôn ngữ (ví dụ: lấy các ứng dụng web, có thể liên quan đến một số ngôn ngữ trong ứng dụng đơn lẻ, như C #, JS, CSS, XPath, SQL, XML, HMTL, RegExp ... và thậm chí các mô hình lập trình khác nhau (ví dụ, C # gần đây đã giới thiệu một số khái niệm từ các mô hình lập trình hàm, lambdas).

Vì vậy, điều cơ bản là học liên tục, mãi mãi :)


0

Tôi nghĩ 3D-Graphics là thứ mà mọi người nên học. Hoặc ít nhất là làm thế nào để sử dụng đúng các vectơ thuần nhất và các phép biến đổi ma trận.

Nó có thể hữu ích không chỉ cho việc tạo ra các ứng dụng 3D mà còn trong các lĩnh vực cơ khí như chuyển động học nghịch đảo trên rô bốt, tính toán mô men và nhiều thứ khác.

Tôi không hiểu đầy đủ về đại số tuyến tính cho đến khi tôi đọc đồ họa 3D, một trong những khóa học tốt nhất mà tôi từng tham gia mặc dù giáo viên của chúng tôi rất tệ.


0

Vì các máy có nhiều lõi (cả CPU và GPU) đang trở thành tiêu chuẩn, tôi muốn nói là bao gồm các Thuật toán phân tán (từ nhiều luồng đến nhiều máy). Điều quan trọng là phải hiểu xử lý đa luồng và phân tán. Xin lỗi rằng liên kết không thực sự cung cấp nhiều trợ giúp.

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.