Là lập trình hay khoa học máy tính nói chung, tất cả về thuật toán?


40

Là một sinh viên tốt nghiệp, tôi thấy ngày càng phổ biến hơn đối với các công ty có uy tín (như Google, Facebook, Microsoft, ...) để đặt các câu hỏi thuật toán trong bài kiểm tra và các cuộc phỏng vấn của họ. Một vài phần khởi động tôi đã áp dụng để hỏi về thuật toán. Tôi tự hỏi nếu thuật toán lưu loát là điều quan trọng nhất đối với nhà phát triển phần mềm trong các công ty đó?

Nếu câu trả lời là có, phương pháp hay tài nguyên tốt nhất để một người học và thực hành về thuật toán một cách hiệu quả là gì? Tôi dường như không thể quan tâm đến việc giải quyết các vấn đề dường như quá phức tạp được tìm thấy trong hầu hết các sách giáo khoa hoặc trang web. Mặc dù dễ dàng hiểu các thuật toán cơ bản (như quicksort, bubbleort, ...), tôi thấy rất khó để nhớ và sử dụng lại chúng sau này.

Cảm ơn.

P / S: Nếu bạn hỏi tôi thích gì, thì đó là xây dựng phần mềm tốt để giải quyết vấn đề của người dùng một cách sáng tạo. Tôi cho rằng điều đó không nhất thiết có nghĩa là phần mềm phải rất phức tạp.


26
Bạn có biết Google phức tạp đến mức nào khi cho phép bạn tìm kiếm toàn bộ web bằng hộp văn bản và nút không?
JeffO

21
@JeffO Tôi thậm chí không sử dụng nút này nữa ;-)
maple_shaft

1
Nếu Google làm cho nó dễ dàng hơn, tất cả các trang tìm kiếm khác sẽ không cần bất kỳ mã nào cả.
JeffO

Tôi nghĩ câu hỏi sẽ là về cách thức máy tính hoạt động, như CPU ​​hoạt động như thế nào, RAM hoạt động như thế nào, wifi hoạt động như thế nào, v.v ... Đó là những câu hỏi khá thú vị vẫn còn phải nghiên cứu khá nhiều. Tôi vẫn thấy phần cứng tuyệt vời hơn tất cả các chương trình chuyên viên máy tính trong java hoặc php.
jokoon

2
Đó không phải là tất cả về thuật toán, nhưng thực sự chúng là cốt lõi của CS. Nhưng có rất nhiều thứ để lập trình hơn là chỉ thuật toán và logic (ví dụ, duy trì mã, sẽ không chỉ đòi hỏi kiến thức về thuật toán).
haylem

Câu trả lời:


44

Các thuật toán rõ ràng

Đây là điều hay về thuật toán: Không gian vấn đề họ giải quyết được xác định rõ, tức là các yêu cầu của bạn không chỉ thực sự được biết đến , mà thậm chí còn được chính thức hóa giống như các số liệu về chất lượng của giải pháp.

Vì vậy, nếu tôi bảo bạn đưa ra một thuật toán, sẽ không có nhiều tiềm năng cho các vấn đề giao tiếp và đo lường hiệu suất của bạn là một nhiệm vụ không quan trọng. Đồng thời hiệu suất của bạn là một chỉ số khá tốt cho khả năng suy nghĩ logic của bạn.

Các thuật toán là một bộ lọc hiệu quả

Vấn đề hiện tại của ngành (và giáo dục) là chất lượng trung bình kém của sinh viên tốt nghiệp. Điều này đã được minh họa bằng thử nghiệm FizzBuzz , đó là:

Viết chương trình, sẽ đi qua các số từ 1 đến 100 và sẽ in "fizz" nếu số đó chia hết cho 3, "buzz" nếu nó chia hết cho 5 và chính số đó nếu chia hết cho cả hai.

Rõ ràng, phần lớn tất cả sinh viên tốt nghiệp Comp Sci không giải quyết được vấn đề này. Xin lưu ý rằng đây là một câu hỏi thuật toán, mặc dù tất nhiên là một câu hỏi đơn giản đáng xấu hổ. Vì điều này, nhận được ai đó có thể giải quyết các loại vấn đề được đưa ra trong Google Code Jam hoặc Project Euler, bạn đã được thưởng thức crème-de-la-crème.

Thuật toán là một phần rất nhỏ trong phát triển phần mềm

Sự thật là, ngay khi bạn làm việc trong ngành, bạn sẽ không sử dụng các kỹ năng thuật toán của mình hơn 1% thời gian.

Trước khi bạn bắt đầu viết mã, trước tiên bạn phải thu thập và phân tích các yêu cầu. Sau đó, bạn phải tổng hợp thiết kế của bạn dựa trên chúng. Sau đó, bạn phải thực hiện thiết kế. Sau đó, bạn phải đánh giá việc thực hiện so với các yêu cầu ban đầu, sau đó lặp lại các yêu cầu, sau đó lặp lại thiết kế, sau đó lặp lại việc thực hiện và cứ thế.

Một trong những yêu cầu là hiệu suất hợp lý . Nếu yêu cầu đó không được đáp ứng, bạn phải lập hồ sơ triển khai để theo dõi các nút thắt cổ chai và sau đó bạn có thể tối ưu hóa nó, đôi khi đó là vấn đề tối ưu hóa vi mô thẳng (điều này khá dễ thực hiện), nhưng đôi khi là vấn đề sử dụng các thuật toán tốt hơn (không phải lúc nào cũng dễ dàng thực hiện sau đó). Vì thế:

Các thuật toán rất quan trọng

Bạn càng nắm bắt tốt các thuật toán, cơ hội lớn hơn là bạn có được nó ngay lần đầu tiên. Mặt khác, bạn không chỉ có khả năng gặp phải một vấn đề chỉ có thể được giải quyết bằng cách thực hiện một thuật toán tốt hơn, mà còn bạn sẽ không thể thực sự giải quyết nó.
Vì vậy, trong khi bạn hầu như không bao giờ cần kỹ năng này, nó chỉ đưa ra một điểm thất bại trong phương pháp phát triển của bạn và nếu bạn không có kỹ năng này, bạn chỉ có thể hy vọng rằng sự cần thiết không bao giờ phát sinh, hoặc người khác nhảy vào để sửa chữa nó bạn.

Điều thực sự quan trọng là có được cảm giác về độ phức tạp tính toán và làm thế nào để giữ nó ở mức thấp, như tôi cũng đã giải thích khi trả lời một câu hỏi tương tự . Hoặc để chuyên về những thứ đơn giản là không quan trọng, chẳng hạn như phát triển GUI, nhưng một lần nữa hầu như mọi người đều ghét nó ... vì một lý do!


5
+1 cho câu trả lời rất toàn diện và thông minh. Ngoài ra, thật đáng buồn khi hiệu quả của bộ lọc FizzBuzz. Hoàn toàn không có lý do gì để không thể làm điều đó.
Adam Crossland

4
Tôi nghĩ rằng bạn nên in fizzbuzznếu số đó chia hết cho cả hai và nhiều người trượt trên đó vì bạn cần phải đặt hàng để kiểm tra modulo cẩn thận.
Matthieu M.

1
1% có thể là một chút quá cao
gai

1
@MatthieuM.: In cả hai đều cố hữu trong cách yêu cầu được thực hiện. Thiếu điều đó, có nghĩa là bạn đã không kiểm tra các yêu cầu cẩn thận; Bây giờ, điều tôi thấy thú vị là nó không nói rằng bạn phải in chúng theo bất kỳ thứ tự cụ thể nào, hoặc thậm chí nhất quán theo cùng một thứ tự ...
jmoreno

1
@ back2dos: yeah, nhưng thực hiện theo thứ tự ngẫu nhiên nghe có vẻ vui hơn ... lưu ý rằng yêu cầu được đưa ra trong câu trả lời này không đề cập đến các dòng, chỉ in . Nếu bạn được đưa ra một bài kiểm tra FizzBuzz, có thể đáng để chỉ ra rằng có rất nhiều giả định không có căn cứ trong đó (một lần nữa, nó có thể khiến bạn bị vẽ như một kẻ khôn ngoan).
jmoreno

30

Nói chung, lập trình như một công việc không phải là về thuật toán. Bạn có thể dành nhiều năm để lập trình các ứng dụng CRUD mà không yêu cầu các kỹ năng thuật toán sâu.

Lập trình như một công việc là về:

  1. Giao tiếp:

    • Mã nguồn của bạn là một phương tiện để truyền đạt ý tưởng của bạn đến các đồng nghiệp của bạn. Nếu không ai có thể đọc / hiểu mã của bạn, điều đó thật vô ích.

    • Một nhà phát triển đơn độc không nói chuyện với bất kỳ nhà phát triển nào khác có thể sẽ bắt đầu mắc lỗi về mã và tin rằng cách tiếp cận của riêng anh ta là cách duy nhất được chấp nhận.

    • Bạn phải biết cách giao tiếp với các bên liên quan, bộ phận QA, người dùng, nhà thiết kế hình ảnh, DBA, v.v.

    • Là một nhà phát triển có kinh nghiệm, bạn phải dạy cho những đồng nghiệp ít kinh nghiệm muốn cải thiện kỹ năng của họ.

  2. Kiến thức về các công cụ phù hợp: kiểm soát phiên bản, hệ thống theo dõi lỗi, IDE, ngôn ngữ nào phù hợp hơn cho một nhiệm vụ cụ thể và tại sao, cách sử dụng phân tích mã, v.v.

  3. Kiến thức và văn hóa rộng lớn: ngôn ngữ chức năng là gì? Làm thế nào máy tính giải thích mã? Tại sao LỘC là một biện pháp vô nghĩa? v.v.

  4. Kiến thức sâu về ngôn ngữ bạn làm việc cùng.

  5. Thuật toán.

Khoa học máy tính, mặt khác, định hướng nhiều hơn cho các thuật toán. Nếu bạn làm việc như một nhà khoa học, điều này có thể không liên quan gì đến công việc của một nhà phát triển và bạn sẽ làm việc nhiều hơn về cách tối ưu hóa thuật toán, cách chuyển đổi biểu diễn dữ liệu thành một biểu tượng khác, v.v.


12
-1: "Ứng dụng CRUD" là các thuật toán. Họ chỉ (nói chung) đơn giản. Không có "ý nghĩa cao quý".
S.Lott

2
và mã nguồn là kênh liên lạc duy nhất của bạn với máy tính thực hiện chính xác những gì bạn bảo nó làm (và hầu như không bao giờ những gì bạn muốn nó làm)
ratchet freak

5
Thật đáng kinh ngạc là thị trường tốt như thế nào để làm sạch các ứng dụng CRUDdy mà các nhóm kỹ thuật đã bỏ qua (hoặc không bao giờ học) những điều cơ bản của thuật toán.
JasonTrue

2
@ S.Lott: "Ứng dụng CRUD là thuật toán" tương tự như "Tôi là nước Mỹ". ;)
Jim G.

1
@JimG: Như Steven Colbert nói "Tôi là nước Mỹ và bạn cũng vậy". Các ứng dụng CRUD chứa, dựa trên, bao gồm, là các triển khai, là hiện thực hóa, thể hiện, phản ánh các thuật toán. Bạn chỉ phàn nàn, mà không đề xuất một giới từ cụ thể. Điều gì sẽ làm cho bạn hạnh phúc hơn?
S.Lott

16

Tôi nghĩ rằng các câu hỏi về thuật toán trong các cuộc phỏng vấn là một trong những cách chính mà các công ty cố gắng đánh giá sự nắm bắt của ứng viên về các nguyên tắc cơ bản của khoa học máy tính. Mặc dù đây không phải là lĩnh vực kỹ năng quan trọng duy nhất cho một lập trình viên chuyên nghiệp, nhưng nó là một trong những năng lực cốt lõi của một lập trình viên giỏi.

Tôi nghĩ lý do rất nhiều công ty lớn nhấn mạnh các nguyên tắc cơ bản của CS trong quá trình phỏng vấn của họ, đó là kỹ năng cốt lõi được phát triển ít nhất sau khi tốt nghiệp và đi vào lực lượng lao động. Khả năng lập trình thực tế, kỹ năng thiết kế, thực hành kỹ thuật phần mềm và những thứ tương tự là tất cả những thứ được phát triển chủ yếu thông qua kinh nghiệm, trong khi các nguyên tắc cơ bản về CS của bạn chủ yếu được phát triển trong quá trình giáo dục của bạn.

Về cách thực hành thiết kế thuật toán, Steve Yegge khuyến nghị Hướng dẫn thiết kế thuật toán của Skiena trong hướng dẫn tuyệt vời của ông để phỏng vấn như một lập trình viên .


4
+1: ngôn ngữ lập trình, khung, hệ điều hành, biên tập viên, bộ công cụ, tất cả đều xuất hiện, nhưng biết cách giải quyết vấn đề hiệu quả có tất cả mọi thứ để biết các nguyên tắc cơ bản của cấu trúc dữ liệu và thuật toán. Những điều này ở lại với chúng tôi luôn.
Adam Crossland

"Về cách thực hành thiết kế thuật toán, Steve Yegge giới thiệu Hướng dẫn thiết kế thuật toán của Skiena trong hướng dẫn tuyệt vời của ông để phỏng vấn như một lập trình viên." Xin lỗi, nhưng điều này có thể không áp dụng được cho người hỏi câu hỏi này khi anh ta là học sinh tốt nghiệp. Google / MS đã chuyển từ Skiena (dành cho học sinh tốt nghiệp), để đặt câu hỏi xuất hiện trong các cuộc thi lập trình đại học quốc tế. (Điều này tôi biết chắc chắn từ kinh nghiệm giai thoại). Cuốn sách của Skiena vẫn được sử dụng - nhưng chủ yếu dành cho các ứng cử viên cấp dưới.
dùng396089

Đối với các câu hỏi xuất hiện trong các cuộc thi lập trình - bạn sẽ bị hóc búa khá nhiều nếu bạn chưa thấy câu hỏi trước đó (trừ khi IQ của bạn cũng cách 3 SD so với bình thường)
user396089

11

Là một nhà phát triển phần mềm thành công, tự học và chỉ tham gia một vài khóa học về khoa học máy tính ở trường đại học, tôi sẽ nói rằng những vấn đề lớn nhất đối với doanh nghiệp hiện nay không phải là khả năng cho tất cả các lập trình viên của họ viết một thuật toán sắp xếp bong bóng theo cách hiệu quả nhất khả thi. Những vấn đề thực sự mà các doanh nghiệp phải đối mặt:

  • Các nhà phát triển không thể nhanh chóng học hỏi và thích nghi với các miền mới

  • Các nhà phát triển không thể tương tác xã hội với khách hàng hoặc các bên liên quan theo cách có ý nghĩa

  • Các nhà phát triển không thể đoán thứ hai và đặt câu hỏi không chính xác hoặc suy nghĩ kém về các yêu cầu kinh doanh

  • Các nhà phát triển không hiểu cách kiểm tra kỹ lưỡng mã và tính năng của họ

  • Các nhà phát triển không thể cung cấp các ước tính có ý nghĩa một cách kịp thời

  • Các nhà phát triển không thể tạo tài liệu rõ ràng và súc tích

  • Các nhà phát triển không thể tự bắt đầu hoặc chịu trách nhiệm về một tình huống

Chín trong số mười lần tôi sẽ đánh cuộc rằng gần như tất cả các tình huống mà một nhà phát triển lúng túng trong một công ty là vì họ vô vọng thất bại ở một trong những phẩm chất trên. Quên Google và Facebook, họ là những trường hợp ngoại lệ và có nhu cầu chính đáng cho những người hiểu sâu về khoa học máy tính.

Các doanh nghiệp thực sự mặc dù không đấu tranh với sự phức tạp của khoa học máy tính, họ đấu tranh với sự phức tạp của nhân loại. Vấn đề là thật sự khó kiểm tra những phẩm chất nêu trên. Hầu hết thời gian bạn phải đánh giá mọi người về những phẩm chất này dựa trên phản ứng ruột của bạn. Điều đó thật khó nếu bạn không có kỹ năng và trực giác tốt, việc kiểm tra kiến ​​thức thuật toán sẽ dễ dàng hơn nhiều.


+1 Các công ty thường xuyên và không giống như google sẽ cần những người có kỹ năng kinh doanh tốt và chủ yếu là hiểu cách phát minh / áp dụng / quản lý / sửa đổi các quy trình. Không có gì nhầm lẫn khi các công ty giống như Google không ấp ủ phong trào Agile, vì khoa học máy tính không phải là giải quyết các vấn đề kinh doanh.
S.Robins

10

Cá nhân tôi thấy các thuật toán và cơ sở dữ liệu "tiêu chuẩn" là một phần của từ vựng của lập trình viên. Và nhiều vấn đề thực tế mà bạn gặp phải khi là một lập trình viên thường có một giải pháp (ít nhất là một phần) có thể diễn tả được trong từ vựng này.

Có vốn từ vựng này theo ý của bạn giúp bạn không phải đưa ra các giải pháp "của riêng mình" (phát minh lại bánh xe để nói), cho phép bạn làm việc thông minh hơn và thường nhanh hơn.

"Tôi dường như không thể quan tâm đến việc giải quyết các vấn đề dường như quá phức tạp được tìm thấy trong hầu hết các sách giáo khoa hoặc trang web"

"Tôi cảm thấy vô cùng khó khăn để nhớ và tái sử dụng chúng sau này"

Buộc mình phải hoàn thành chúng. Bạn sẽ cảm ơn chính mình sau này. Ngay cả khi bạn không nhớ chúng đầy đủ chi tiết (mặc dù với thực hành đủ chắc chắn bạn sẽ làm được), để có thể nói "Tôi nhớ việc giải quyết một cái gì đó tương tự bằng thuật toán X hoặc cơ sở hạ tầng Y" sẽ giúp bạn rất nhiều. Ngay cả khi nó yêu cầu bạn tìm kiếm các chi tiết và làm mới bộ nhớ của bạn.


+1 cho cấu trúc dữ liệu. Họ là một nửa còn lại của đồng tiền thuật toán.
Spencer Rathbun

9

Mặc dù bạn không thể trở thành một lập trình viên giỏi mà không biết các thuật toán của mình, nhưng thật không công bằng khi giữ các khía cạnh khác của nghề lập trình ra khỏi bức tranh. Ví dụ, kỷ luật nghiêm ngặt và mệnh lệnh tốt của ngôn ngữ mẹ đẻ của bạn ít nhất có ý nghĩa quan trọng đối với việc trở thành một lập trình viên giỏi như kiến ​​thức về thuật toán của bạn. Người ta cũng không nên đánh giá thấp tầm quan trọng của việc hiểu các công cụ cơ bản của bạn, chẳng hạn như ngôn ngữ lập trình, hệ thống kiểm soát nguồn, môi trường thử nghiệm, et cetera.

Tuy nhiên, khi nói đến các cuộc phỏng vấn, việc đo lường sự hiểu biết của bạn về các thuật toán đơn giản hơn rất nhiều so với việc đo các khả năng khác của bạn liên quan đến làm việc như một lập trình viên. Đó là lý do tại sao người phỏng vấn thường tập trung vào việc hỏi về các thuật toán và chú ý đến cách bạn giải thích chúng trong cuộc phỏng vấn. Không phải vì những thứ khác ít quan trọng hơn, mà bởi vì thật khó để đánh giá những thứ khác trong 30 phút được phân bổ cho cuộc phỏng vấn.


1
+1 Câu trả lời hoàn hảo! Nó dễ dàng hơn để kiểm tra kiến ​​thức thuật toán.
maple_shaft

"Thuật toán của bạn" - Tôi tự học. Có một nguồn hoặc danh sách nào đó nêu rõ những thuật toán phổ biến này mà mọi lập trình viên nên biết không? Tôi muốn đọc qua chúng. Cảm ơn!
Ominus

2
@Ominus Mặc dù không có sự đồng thuận chung về "danh sách quý ông" về thuật toán, trong hầu hết các trường hợp, nó sẽ bao gồm tìm kiếm, sắp xếp, duyệt qua các cấu trúc dữ liệu thiếu tính liên tục không gian (danh sách được liên kết, cây nhị phân, v.v.) và thô sơ (mis) các ứng dụng đệ quy (giai thừa đệ quy, chuỗi Fibonacci, v.v.)
dasblinkenlight

@Ominus - Tôi cũng tự học nhưng tôi nghĩ "Giới thiệu về thuật toán" - CLRS là một cách tốt để làm quen với lĩnh vực này. Cuốn sách "Cẩm nang thiết kế thuật toán" của Skiena cũng hay.
Tod

5

Vâng, lập trình chủ yếu là về các thuật toán.

Nhưng có lẽ không phải theo nghĩa mà bạn đang nghĩ.

Tôi có ấn tượng tất cả chúng ta đều sử dụng các định nghĩa khác nhau của thuật toán. Thành thật mà nói, câu hỏi này rất khó trả lời vì thuật toán là một thuật ngữ mơ hồ. Tôi sẽ sử dụng định nghĩa của Wikipedia để trả lời câu hỏi này:

Một tập hợp các quy tắc xác định chính xác một chuỗi các hoạt động.

Đây là trái tim và linh hồn của lập trình. Khi bạn viết bất kỳnào , bạn chỉ đang thực hiện một thuật toán. Nếu bạn đang viết một số ứng dụng CRUD, bạn đang thực hiện một thuật toán đơn giản. Có thể đưa ra một thuật toán để giải quyết vấn đề là lập trình là gì. Phần còn lại chỉ là chi tiết.

Tôi không đồng ý với poster trước đó nói rằng việc hiểu sâu về ngôn ngữ quan trọng hơn việc hiểu các thuật toán. Bất kỳ lập trình viên giỏi nào cũng có thể học sâu một ngôn ngữ, nhưng không có thuật toán, bạn không thể tự mình đưa ra bất kỳ mã nào.


Từ góc độ khác, trong Toán học, trái tim và linh hồn có thể là thuật toán, tuy nhiên đối với Lập trình thì đó là một thứ khác. Bạn có thể viết phần mềm mà không cần thuật toán mỗi lần (có lẽ không phải phần mềm tốt), nhưng bạn không thể viết phần mềm mà không có logic và suy nghĩ trừu tượng. Tại nó tim tuy nhiên, đó là về giải quyết vấn đề. Tìm giải pháp là một quá trình thuật toán, nhưng bản thân giải pháp không nhất thiết phải là thuật toán.
S.Robins

4

Câu trả lời hoàn toàn phụ thuộc vào công việc bạn đang theo đuổi. Một số lĩnh vực đặc biệt tập trung nhiều thuật toán hơn các lĩnh vực khác. Nói đến lưu ý đó mặc dù tôi rất vui được phỏng vấn với Amazon nhiều lần. Mặc dù vị trí này sẽ ít liên quan đến các thuật toán phức tạp này, tôi vẫn chưa biết cách thực hiện một nhiệm vụ được khấu hao theo thời gian không đổi.

Những gì chứng minh sự hiểu biết mạnh mẽ về các thuật toán cung cấp là bằng chứng cho nhà tuyển dụng tiềm năng của bạn rằng bạn là người giải quyết vấn đề thích hợp. Nó không thực sự là một chỉ số tốt (IMO) của một nhân viên tốt nhưng một số nhà tuyển dụng sử dụng điều này để sàng lọc. Nếu bạn đang ứng tuyển vào một vị trí yêu cầu bằng tốt nghiệp, bạn sẽ có một nền tảng khắt khe hơn về thuật toán.

Những gì (IMO) rất hữu ích trong thực tế không phải là ghi nhớ các thuật toán cụ thể mà thông qua việc hiểu một số thuật toán hoạt động như thế nào, có một cái vũng nhỏ này ở phía sau tâm trí của bạn, nơi bạn sẽ nói "Tôi đã thấy điều này trước đây" hoặc "Tôi biết tôi có thể làm điều này tốt hơn "sẽ sinh ra một chút nghiên cứu về giải pháp cho vấn đề của bạn.


+1 để nói về thanh tuyển dụng cho học sinh tốt nghiệp. Một số công ty ồn ào hơn khi tuyển dụng sinh viên tốt nghiệp hơn sinh viên đại học. Nhưng để công bằng với họ, sinh viên tốt nghiệp cũng được trả lương cao hơn, và thường được tuyển dụng ở cấp cao hơn trong nội bộ.
dùng396089

1

Tôi luôn nghĩ rằng lập trình dựa trên dữ liệu nhiều hơn thuật toán .. nhưng sau đó, sử dụng dữ liệu là gì nếu bạn không làm gì với nó ... tất cả các thao tác đó đều là thuật toán. Vì vậy, thực sự, vâng, lập trình khá nhiều dựa trên thuật toán.

Nó có thể trông không giống toán học, và rất nhiều công việc thuật toán bạn làm hàng ngày rất đơn giản chỉ là gửi dữ liệu giữa GUI và chương trình, nhưng cũng được tính là một thuật toán. Chèn một phần tử trong hộp danh sách là một thuật toán chèn tiêu chuẩn đi kèm với các vấn đề riêng của nó như các thao tác cấu trúc danh sách và hiệu năng.


1

Chỉ những lập trình viên làm việc cho những công ty đó mới thực sự có thể trả lời câu hỏi của bạn. Các loại thuật toán được xử lý trong câu nói "Giới thiệu về thuật toán" có lẽ đã đóng một phần trong 0,01% cuộc đời lập trình của tôi trong 25 năm qua. Khi tôi cần một cấu trúc dữ liệu hoặc sắp xếp thường thì các thư viện hoặc khung được cung cấp có những gì tôi cần. Khi tôi cần một FFT siêu nhanh, tôi tìm thấy thứ gì đó giống như lib Intel Math hơn là tự viết. Tuy nhiên, tôi có thể thấy những gì họ làm ở Google khác với những gì tôi đã làm trong sự nghiệp của mình. Cuốn sách "Cẩm nang thiết kế thuật toán" của Skiena đã mở mắt vì những câu chuyện Chiến tranh mà ông kể. Bạn có thể nói anh ta sử dụng Thuật toán trong công việc của mình RẤT NHIỀU.

Theo kinh nghiệm của tôi với tư cách là một nhà tư vấn lập trình độc lập, thành công đến từ ba điều 1. Giao tiếp hiệu quả với khách hàng 2. Viết mã hoạt động. 3. Quản lý phức tạp

Chỉ làm số 1 và 2 là không đủ. Nếu mã không thể duy trì được (bởi một người nào đó không phải là lập trình viên đã viết nó, thì nó sẽ bị tiêu diệt.

Số 3 là kỹ năng lập trình khó nhất để thành thạo. Nó đòi hỏi suy nghĩ được đưa vào kiến ​​trúc, thiết kế và mã hóa. Nó đòi hỏi phải thành thạo tái cấu trúc. Nó đòi hỏi sự hiểu biết về các nguyên tắc RẮN / DRY. Nếu tôi phải thuê một lập trình viên đã đọc Giới thiệu về Thuật toán và tận tâm làm chủ nó hoặc một người đọc Lập trình viên thực dụng và tận tâm trở thành một người, tôi sẽ thuê người sau. (Không phải họ phải loại trừ lẫn nhau).


1

Vâng.

Khoa học máy tính chủ yếu là các thuật toán (theo tỷ lệ phần trăm).

Không.

Nhưng đó là "Khoa học" của máy tính. Ứng dụng phổ biến nhất của Khoa học máy tính là Kỹ thuật phần mềm. Kỹ thuật phần mềm không phải là thuật toán chủ yếu. Chủ yếu là về nghệ thuật sáng tạo, theo đuổi sự hoàn hảo và tập trung vào việc ảnh hưởng tích cực đến cuộc sống của những người thực sự tồn tại ngày nay. Mặc dù Khoa học Máy tính có thể chia sẻ một số động lực tương tự, nhưng nó khác xa so với Kỹ thuật phần mềm.

Hỏi một giáo sư có nhiệm kỳ tại một trường đại học Khoa học Máy tính lớn, điều quan trọng nhất cần hiểu về lập trình là gì, và họ có thể sẽ cho bạn biết "thuật toán và cấu trúc dữ liệu"

Hỏi một nhà phát triển cấp cao tại một công ty phần mềm lớn, điều quan trọng nhất cần hiểu về lập trình là gì, và họ có thể sẽ nói với bạn, "học cách làm hài lòng khách hàng" (ngụ ý là hiểu nhanh, suy nghĩ như khách hàng, giao hàng đúng giờ và liên tục, làm cho mọi thứ hoạt động , vv)

Có thể giống như ngữ nghĩa, nhưng từ sự hiểu biết của tôi, cả hai khác biệt đáng kể cả về thực tiễn và lý thuyết.


1

Nếu tôi phải chọn một thứ trong khoa học máy tính là phần quan trọng nhất của nó, tôi sẽ chọn trừu tượng , không phải thuật toán.


1

Trong Khoa học máy tính, những khái niệm bạn học sẽ không có ích gì cho đến khi bạn trình bày nó. Vấn đề là mối quan tâm chính cần được giải quyết vì vậy thuật toán là một kế hoạch ngắn gọn về cách giải quyết vấn đề nói chung. Do đó, nó là mối quan tâm lớn trong thế giới Khoa học Máy tính.

Tôi nghĩ rằng hầu hết mọi khía cạnh của Khoa học máy tính đều cần Thuật toán Hãy để tôi chỉ cho bạn điều này Danh sách sau đây sẽ bao gồm các lĩnh vực Khoa học máy tính khác nhau và thuật toán họ sử dụng.

Tự động

Powerset xây dựng. Thuật toán để chuyển đổi tự động không điều kiện sang tự động xác định. Thuật toán Todd-Coxeter. Thủ tục tạo coset.

Trí tuệ nhân tạo

Alpha-beta. Alpha max cộng với beta tối thiểu. Được sử dụng rộng rãi trong các trò chơi bảng. Ant-thuật toán. Tối ưu hóa đàn kiến ​​là một tập hợp các thuật toán lấy cảm hứng từ hành vi của kiến ​​để giải quyết vấn đề, tìm đường đi tốt nhất giữa hai địa điểm. DE (Tiến hóa khác biệt). Giải bài toán phù hợp đa thức Ch Quashev. Công nhận bán giám sát các câu Sarcastic trong đánh giá sản phẩm trực tuyến. Algortithm nhận ra sacarsms hoặc trớ trêu trong một tweet hoặc một tài liệu trực tuyến. Một thuật toán như vậy cũng rất cần thiết cho lập trình robot hình người.

Tầm nhìn máy tính

Bản tóm tắt. Đại diện cho một hình ảnh hoặc video bằng một hình nhỏ hơn. Đếm các đối tượng trong một hình ảnh . Sử dụng thuật toán ghi nhãn thành phần được kết nối để trước tiên gắn nhãn cho từng đối tượng và đếm sau đó các đối tượng. Thuật toán O'Carroll. Từ một chuyển đổi toán học của tầm nhìn côn trùng, thuật toán này đánh giá làm thế nào để tránh xung quanh tránh các vật thể.

Thuật toán di truyền

Họ sử dụng ba toán tử. lựa chọn (chọn giải pháp), tái tạo (sử dụng các giải pháp được chọn để xây dựng các giải pháp khác), thay thế (thay thế giải pháp nếu tốt hơn).

Lựa chọn cân đối. Còn được gọi là lựa chọn bánh xe roulette, là một chức năng được sử dụng để chọn giải pháp. Lựa chọn cắt ngắn. Một phương pháp khác để lựa chọn giải pháp, được sắp xếp theo thể dục. Lựa chọn giải đấu. Chọn giải pháp tốt nhất bằng một loại giải đấu. Lấy mẫu phổ ngẫu nhiên. Các cá nhân được ánh xạ tới các phân đoạn liền kề của một dòng, sao cho mỗi phân đoạn của từng cá nhân có kích thước tương đương với thể lực của nó chính xác như trong lựa chọn bánh xe roulette.

Mạng lưới thần kinh

Lưới Hopfield. Mạng thần kinh nhân tạo định kỳ phục vụ như các hệ thống bộ nhớ có thể định địa chỉ nội dung với các đơn vị ngưỡng nhị phân. Chúng hội tụ đến trạng thái ổn định. Backpropagation. Kỹ thuật học tập giám sát được sử dụng để đào tạo mạng lưới thần kinh nhân tạo. Bản đồ tự tổ chức (bản đồ Kohonen). Mạng lưới thần kinh được đào tạo sử dụng phương pháp học tập không giám sát để tạo ra đại diện chiều thấp (2D, 3D) của các mẫu đào tạo. Tốt để hiển thị dữ liệu chiều cao.

Tin sinh học

Needman-Wunsch. Thực hiện liên kết toàn cầu trên hai trình tự, cho trình tự protein hoặc nucleotide. Smith-Waterman. Sự thay đổi của Needman-Wunsch.

Nén

Thuật toán nén không mất dữ liệu

Biến đổi Burrows-Wheeler. Tiền xử lý hữu ích để cải thiện nén không mất mát. Xì hơi. Nén dữ liệu được sử dụng bởi ZIP. Mã hóa Delta. Hỗ trợ nén dữ liệu trong đó dữ liệu tuần tự xảy ra thường xuyên. Mã hóa tăng dần. Mã hóa Delta áp dụng cho chuỗi chuỗi. LZW. (Lempel-Ziv-Welch). Người kế nhiệm LZ78. Xây dựng bảng dịch từ dữ liệu để nén. Được sử dụng bởi định dạng đồ họa GIF. LZ77 và 78. Cơ sở của các biến thể LZ tiếp theo (LZW, LZSS, ...). Họ đều là lập trình viên từ điển. LZMA. Viết tắt của thuật toán chuỗi Lempel-Ziv-Markov. LZO.Thuật toán nén dữ liệu được tập trung vào tốc độ. PPM(Dự đoán bằng cách khớp một phần). Kỹ thuật nén dữ liệu thống kê thích ứng dựa trên mô hình và dự đoán bối cảnh. Mã hóa Shannon-Fano. Xây dựng mã tiền tố dựa trên một tập hợp các ký hiệu và xác suất của chúng. Nhị phân nhị phân. Một mã hóa entropy thường được sử dụng để phân phối xác suất thống nhất với một bảng chữ cái hữu hạn. Cải thiện mã hóa nhị phân. Mã hóa chiều dài chạy. Nén chính thay thế một chuỗi cùng mã bằng số lần xuất hiện. Sequitur. Suy luận ngữ pháp tăng dần trên một chuỗi. EZW (Wavelet nhúng Zerotree). Mã hóa lũy tiến để nén hình ảnh thành một luồng bit với độ chính xác tăng dần. Có thể nén mất mát với kết quả tốt hơn.

Lược đồ mã hóa Entropy gán mã cho các ký hiệu để khớp độ dài mã với xác suất của các ký hiệu.

Mã hóa Huffman. Nén lossless đơn giản tận dụng tần số ký tự tương đối. Mã Huffman thích ứng. Kỹ thuật mã hóa thích ứng dựa trên mã hóa Huffman. Mã hóa số học. Mã hóa entropy tiên tiến. Mã hóa phạm vi. Giống như mã hóa số học, nhưng nhìn theo một cách hơi khác. Mã hóa đơn phương. Mã đại diện cho một số n với n số theo sau là số không. Elias delta, gamma, mã hóa omega. Mã phổ quát mã hóa các số nguyên dương. Mã hóa Fibre. Mã phổ quát mã hóa các số nguyên dương thành các từ mã nhị phân. Mã hóa Golomb. Hình thức mã hóa entropy tối ưu cho bảng chữ cái sau các phân phối hình học. Gạo mã hóa. Hình thức mã hóa entropy tối ưu cho bảng chữ cái sau các phân phối hình học.

Thuật toán nén tổn thất

Mã hóa dự đoán tuyến tính. Nén tổn thất bằng cách biểu diễn đường bao phổ của tín hiệu số của lời nói ở dạng nén. Thuật toán A-law. Thuật toán biên dịch chuẩn. Thuật toán Mu-law. Thuật toán nén hoặc nén tín hiệu tương tự tiêu chuẩn. Nén Fractal. Phương pháp được sử dụng để nén hình ảnh bằng cách sử dụng fractals. Chuyển đổi mã hóa. Loại nén dữ liệu cho dữ liệu như tín hiệu âm thanh hoặc hình ảnh chụp ảnh. Phép lượng tử vector. Kỹ thuật thường được sử dụng trong nén dữ liệu mất mát. Nén rốn. Hình thức nén dữ liệu rất phù hợp cho nén hình ảnh và âm thanh.

Mật mã

Khóa bí mật (mã hóa đối xứng)

Sử dụng khóa bí mật (hoặc một cặp khóa liên quan trực tiếp) cho cả giải mã và mã hóa.

Tiêu chuẩn mã hóa nâng cao (AES) , còn được gọi là Rijndael. Cá thổi. Được thiết kế bởi Schneier như một thuật toán đa năng, nhằm mục đích thay thế cho DE cũ. Tiêu chuẩn mã hóa dữ liệu (DES) , trước đây là thuật toán DE. IDEA (Thuật toán mã hóa dữ liệu quốc tế) . IPES trước đây (PES được cải tiến), một sự thay thế khác cho DES. Được sử dụng bởi PGP (Quyền riêng tư khá tốt). Thực hiện các phép biến đổi trên dữ liệu được chia thành các khối, sử dụng một phím. RC4 hoặc ARC4. Truyền mật mã được sử dụng rộng rãi trong các giao thức như SSL cho lưu lượng truy cập Internet và WEP cho các mạng không dây. Thuật toán mã hóa nhỏ. Dễ dàng thực hiện thuật toán mã hóa khối bằng một số công thức. PES (Tiêu chuẩn mã hóa được đề xuất). Tên cũ hơn cho IDEA.

Khóa công khai (mã hóa bất đối xứng)

Sử dụng một cặp khóa, được chỉ định là khóa chung và khóa riêng. Khóa công khai mã hóa tin nhắn, chỉ có khóa riêng mới cho phép giải mã nó.

DSA (Thuật toán chữ ký số). Tạo khóa với số nguyên tố và số ngẫu nhiên. Đã được sử dụng bởi các cơ quan Hoa Kỳ, và bây giờ phạm vi công cộng. ElGamal. Dựa trên Diffie-Hellman, được sử dụng bởi phần mềm GNU Privacy Guard, PGP và các hệ thống mật mã khác. RSA (Rivest, Shamir, Adman). Được sử dụng rộng rãi trong các giao thức thương mại điện tử. Sử dụng số nguyên tố. Trao đổi khóa Diffie-Hellman (Merkle) (hoặc trao đổi khóa theo cấp số nhân). Phương pháp và thuật toán để chia sẻ bí mật trên một kênh truyền thông không được bảo vệ. Được sử dụng bởi RSA. Mã hóa NTRUE. Sử dụng các vòng đa thức với phép nhân tích chập.

Chức năng thông báo

Thông báo thông báo là một mã kết quả của việc mã hóa chuỗi hoặc dữ liệu có độ dài bất kỳ, được xử lý bởi hàm băm.

MD5. Được sử dụng để kiểm tra hình ảnh ISO của đĩa CD hoặc DVD. RIPEMD (Thông báo đánh giá nguyên thủy đánh giá toàn vẹn RACE). Dựa trên các nguyên tắc của MD4 và tương tự như SHA-1. SHA-1 (Thuật toán băm an toàn 1). Được sử dụng phổ biến nhất trong bộ SHA của các hàm băm mật mã có liên quan. Được thiết kế bởi cơ quan NSA. HMAC. xác thực tin nhắn keyed-hash. Hổ (TTH). Thường được sử dụng trong băm cây Tiger.

Mật mã sử dụng số giả ngẫu nhiên Xem. Máy tạo số ngẫu nhiên

Kỹ thuật mật mã

Chia sẻ bí mật, Chia tách bí mật, Chia tách khóa, M của N thuật toán.

Kế hoạch chia sẻ bí mật của Shamir. Đây là một công thức dựa trên phép nội suy đa thức. Kế hoạch chia sẻ bí mật của Blakley. Là hình học trong tự nhiên, bí mật là một điểm trong một không gian m chiều.

Các kỹ thuật và giải mã khác

Tổng hợp con. Cho một tập hợp các số nguyên, có tập hợp con nào bằng 0 không? Được sử dụng trong mật mã. Thuật toán của Shor. Thuật toán lượng tử có thể giải mã một mã dựa trên các hàm không đối xứng như RSA.

Hình học

Gói quà. Xác định vỏ lồi của một tập hợp các điểm. Khoảng cách Gilbert-Johnson-Keerthi. Xác định khoảng cách nhỏ nhất giữa hai hình lồi. Graham quét. Xác định vỏ lồi của một tập hợp các điểm trong mặt phẳng. Đoạn đường giao nhau. Tìm kiếm xem các dòng giao nhau với một thuật toán dòng quét. Điểm trong đa giác. Kiểm tra xem một điểm nhất định có nằm trong một điểm nhất định không. Giao điểm Ray / Mặt phẳng. * Giao lộ đường / Tam giác. * Trường hợp cụ thể của giao lộ Ray / Máy bay. Đa giác hóa các bề mặt ngầm. Xấp xỉ một bề mặt ngầm với biểu diễn đa giác. Tam giác.Phương pháp đánh giá khoảng cách đến một điểm từ các góc tới các điểm khác, có khoảng cách được biết đến.

Đồ thị Công nghệ theo dõi bề mặt 3D. Quá trình để thêm hình ảnh trên tường trong một video trong khi các bề mặt ẩn được tính đến. Bellman-Ford. Tính toán các đường đi ngắn nhất trong biểu đồ có trọng số (trong đó một số trọng số cạnh có thể âm). Thuật toán của Dijkstra. Tính toán các đường dẫn ngắn nhất trong biểu đồ với trọng số cạnh không âm. Phương pháp gây nhiễu. Một thuật toán tính toán các đường dẫn ngắn nhất cục bộ trong biểu đồ. Floyd-Warshall. Giải quyết tất cả các cặp bài toán đường đi ngắn nhất trong đồ thị có hướng, có trọng số. Tìm kiếm chu kỳ của Floyd. Tìm chu kỳ trong các lần lặp. Johnson. Tất cả các cặp thuật toán đường dẫn ngắn nhất trong đồ thị định hướng có trọng số thưa thớt. Kruskal.Tìm một cây bao trùm tối thiểu cho một biểu đồ. Prim. Tìm một cây bao trùm tối thiểu cho một biểu đồ. Cũng được gọi là thuật toán DJP, Jarník hoặc Primifer Jarník. * Boruvka. * Tìm một cây bao trùm tối thiểu cho biểu đồ. Ford-Fulkerson. Tính toán lưu lượng tối đa trong biểu đồ. Edmonds-Karp. Triển khai Ford-Fulkerson. Công tắc Spanning tối thiểu không chặn. Để trao đổi qua điện thoại. Nhà gỗ-sắc nét. Tìm một cây bao trùm tối thiểu cho một biểu đồ. Mùa xuân dựa. Thuật toán vẽ đồ thị. Hungary Thuật toán để tìm một kết hợp hoàn hảo. Thuật toán tô màu. Thuật toán tô màu. Hàng xom gần nhất.Tìm hàng xóm gần nhất. Phân loại cấu trúc liên kết. Sắp xếp một biểu đồ chu kỳ có hướng theo cách sao cho mỗi nút xuất hiện trước tất cả các nút mà nó có các cạnh (theo chỉ dẫn). Thuật toán tổ tiên ít phổ biến nhất của Tarjan. Tính toán tổ tiên chung thấp nhất cho các cặp nút trong cây.

Đồ họa

Thuật toán dòng của Bresenham. Sử dụng các biến quyết định để vẽ một đường thẳng giữa 2 điểm được chỉ định. Phong cảnh Vẽ một khung cảnh 3D. * Thuật toán dòng DDA. * Sử dụng toán học dấu phẩy động để vẽ một đường thẳng giữa 2 điểm được chỉ định. Lấp đầy. Lấp đầy một vùng kết nối với một màu. Phục hồi hình ảnh. Khôi phục ảnh, cải thiện hình ảnh. Thuật toán dòng của Xiaolin Wu. Đường khử răng cưa. Thuật toán của họa sĩ. Phát hiện các phần có thể nhìn thấy của một cảnh quan 3 chiều. Có hi vọng. Kết xuất hình ảnh thực tế. Phong che nắng. Một mô hình chiếu sáng và một phương pháp nội suy trong đồ họa máy tính 3D. Gouraud che nắng.Mô phỏng các hiệu ứng khác nhau của ánh sáng và màu sắc trên bề mặt của vật thể 3D. Kết xuất đường quét. Xây dựng một hình ảnh bằng cách di chuyển một dòng tưởng tượng. Chiếu sáng toàn cầu. Người tiêu dùng trực tiếp chiếu sáng và phản chiếu từ các đối tượng khác. Nội suy. Xây dựng các điểm dữ liệu mới, chẳng hạn như trong zoom kỹ thuật số. Chất khử trùng. Xóa một đối tượng trên ảnh và xây dựng lại nền được sử dụng bởi Photoshop và The Gimp. Hướng dẫn phục hồi. Thuật toán chặn dốc. Đây là một triển khai của công thức chặn dốc để vẽ đường. Nội suy spline. Giảm lỗi với hiện tượng Runge. Công nghệ theo dõi bề mặt 3D. Thêm hình ảnh hoặc vidéo trên tường trong một vidéo, các bề mặt ẩn được tính đến.

Danh sách, mảng và cây

Đang tìm kiếm

Từ điển tìm kiếm. Xem tìm kiếm dự đoán. Thuật toán lựa chọn. Tìm mục lớn thứ k trong danh sách. Thuật toán tìm kiếm nhị phân. Xác định vị trí một mục trong danh sách được sắp xếp. Bề rộng tìm kiếm đầu tiên. Đi qua một mức đồ thị theo cấp độ. Độ sâu tìm kiếm đầu tiên. Đi qua một nhánh đồ thị theo nhánh. Tìm kiếm đầu tiên tốt nhất. Di chuyển một biểu đồ theo thứ tự có khả năng quan trọng bằng cách sử dụng hàng đợi ưu tiên. Một tìm kiếm cây. * Trường hợp đặc biệt của tìm kiếm đầu tiên tốt nhất sử dụng phương pháp phỏng đoán để cải thiện tốc độ. Tìm kiếm chi phí thống nhất. Một tìm kiếm cây tìm thấy tuyến đường chi phí thấp nhất nơi chi phí khác nhau. Dự đoán tìm kiếm.Nhị phân như tìm kiếm mà yếu tố về độ lớn của thuật ngữ tìm kiếm so với giá trị cao và thấp trong tìm kiếm. Bảng băm. Liên kết các khóa với các mục trong một bộ sưu tập chưa sắp xếp, để truy xuất chúng trong thời gian tuyến tính. Nội suy tìm kiếm. Xem tìm kiếm dự đoán.

Sắp xếp

Phân loại cây nhị phân. Sắp xếp cây nhị phân, tăng dần, tương tự như sắp xếp chèn. Không có thuốc. Không hiệu quả sắp xếp ngẫu nhiên của một thẻ bàn. Sắp xếp bong bóng. Đối với mỗi cặp chỉ số, trao đổi các mặt hàng nếu không theo thứ tự. Sắp xếp xô. Chia một danh sách trong các thùng và sắp xếp chúng riêng lẻ. Tổng quát hóa phân loại pigeonhole. Cocktail sort (hoặc bong bóng hai chiều, bình lắc, gợn sóng, đưa đón, sắp xếp giờ hạnh phúc). Sự biến đổi của sắp xếp bong bóng sắp xếp theo cả hai hướng mỗi lần đi qua danh sách. Lược sắp xếp. Biến đổi hiệu quả của sắp xếp bong bóng giúp loại bỏ "rùa", các giá trị nhỏ ở gần cuối danh sách và sử dụng các khoảng trống giữa các giá trị. Đếm sắp xếp.Nó sử dụng phạm vi số trong danh sách A để tạo một mảng B có độ dài này. Các chỉ mục trong B được sử dụng để đếm có bao nhiêu phần tử trong A có giá trị nhỏ hơn i. Gnome sắp xếp. Tương tự như sắp xếp chèn ngoại trừ việc di chuyển một phần tử đến vị trí thích hợp của nó được thực hiện bằng một loạt các giao dịch hoán đổi, như trong sắp xếp bong bóng. Heapsort. Chuyển đổi danh sách thành một đống, tiếp tục loại bỏ phần tử lớn nhất khỏi heap và thêm nó vào cuối danh sách. Sắp xếp chèn. Xác định vị trí của mục hiện tại trong danh sách các mục được sắp xếp và chèn nó vào đó. Nội tâm. Hoặc sắp xếp nội tâm. Nó bắt đầu trong quicksort và chuyển sang heapsort ở mức đệ quy nhất định. Hợp nhất sắp xếp.Sắp xếp riêng nửa đầu và nửa sau của danh sách, sau đó hợp nhất các danh sách đã sắp xếp. Bánh kếp sắp xếp. Các phần tử đảo ngược của một số tiền tố của một chuỗi. Pigeonhole sắp xếp. Điền vào một mảng trống với tất cả các yếu tố của một mảng sẽ được sắp xếp theo thứ tự. Người đưa thư sắp xếp. Biến thể phân cấp của loại xô, được sử dụng bởi bưu điện. Sắp xếp nhanh chóng. Chia danh sách thành hai, với tất cả các mục trong danh sách đầu tiên đến trước tất cả các mục trong danh sách thứ hai.; sau đó sắp xếp hai danh sách. Thường là phương pháp lựa chọn. Loại radix. Sắp xếp các khóa liên quan đến các mục hoặc số nguyên bằng cách xử lý các chữ số. Lựa chọn sắp xếp. Chọn phần tử nhỏ nhất trong số các phần tử còn lại, thêm nó vào cuối danh sách được sắp xếp. Vỏ sắp xếp.Cải thiện sắp xếp chèn với việc sử dụng khoảng cách giữa các giá trị. Smoothsort. Xem heapsort. Sắp xếp ngẫu nhiên. Xem bogosort.

và nhiều thứ khác nữa...


0

Bạn đã hỏi hai câu hỏi trong tiêu đề câu hỏi, vì vậy tôi sẽ trả lời cả hai câu hỏi.

Vâng, Khoa học Máy tính là tất cả về các thuật toán. Chà ... thực ra đó là một chút sai lầm bởi vì có nhiều khía cạnh đối với khoa học máy tính, vì vậy tôi sẽ viết lại. Khoa học máy tính khi nó được áp dụng trong thế giới làm việc chủ yếu là về các thuật toán. Các công ty như Google, Facebook và tất cả những nơi điên rồ ở Phố Wall thuê các nhà Vật lý và Nhà phát triển muốn các vấn đề rất phức tạp được giảm xuống thành một hình thức đơn giản, bản thân nó đòi hỏi sự hiểu biết sâu sắc về toán học và thiết kế thuật toán.

Không, lập trình không phải là tất cả về thuật toán. Lập trình là về việc lấy các đặc tả và chuyển đổi chúng thành mã có thể được biên dịch để thực thi.

Phần bổ sung của câu trả lời: Phát triển phần mềm không phải là lập trình, và nhiều người dường như nhầm lẫn giữa các thuật ngữ và sử dụng chúng thay thế cho nhau. Lập trình chỉ là một chức năng hoặc một kỹ thuật có lẽ là của quá trình Phát triển Phần mềm lớn hơn. Phát triển phần mềm chắc chắn không phải là tất cả về thuật toán, đó là giải quyết các vấn đề với phần mềm và áp dụng các quy trình tương thích kinh doanh âm thanh để cho phép các vấn đề được giải quyết hiệu quả. Trong khi quá trình phát triển phần mềm - và thậm chí lập trình riêng của mình - có thể là quá trình thuật toán trong tự nhiên của họ, điều này không giống như là về thuật 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.