Điều quan trọng đối với người lập trình là biết cách triển khai thuật toán QuickSort / MergeSort từ bộ nhớ? [đóng cửa]


58

Tôi đã xem xét các ghi chú của mình và tình cờ thực hiện các thuật toán sắp xếp khác nhau.

Khi tôi cố gắng hiểu ý nghĩa của việc triển khai QuickSort và MergeSort, tôi nhận thấy rằng mặc dù tôi lập trình để kiếm sống và coi mình là người giỏi trong những gì tôi làm, tôi không có trí nhớ nhiếp ảnh hay trí tuệ tuyệt đối để thực hiện các thuật toán đó mà không có dựa vào ghi chú của tôi Tất cả những gì tôi nhớ là một số thuật toán đó ổn định và một số thì không. Một số mất thời gian O (nlog (n)) hoặc O (n ^ 2) để hoàn thành. Một số sử dụng nhiều bộ nhớ hơn những người khác ...

Tôi cảm thấy mình không xứng đáng với loại công việc này nếu không phải vì vị trí của tôi không yêu cầu tôi sử dụng bất kỳ thuật toán sắp xếp nào khác ngoài những thuật toán được tìm thấy trong các API tiêu chuẩn. Ý tôi là, có bao nhiêu bạn có một vị trí lập trình trong đó nó thực sự cần thiết mà bạn có thể nhớ hoặc tự mình nghĩ ra loại công cụ này?


13
Bạn cần nhớ rằng một giải pháp tồn tại và khi nào nên sử dụng nó. Sau đó đi vào các tài liệu và thực hiện nó. Nếu bạn chưa biết về quicksort hoặc mergesort, bạn vẫn sẽ sử dụng bubbleort và xem chương trình của bạn sẽ thu thập dữ liệu và đưa ra các giải pháp phụ khi dữ liệu tăng.
Pieter B

1
Ngoài các câu trả lời hay được đề cập dưới đây, cũng cần lưu ý rằng nhiều công ty yêu cầu (1) biết sự phức tạp của các thuật toán đó, (2) thành thạo trong việc thực hiện chúng trên bảng đen.
sakisk

3
Tôi chắc chắn việc ghi nhớ các thuật toán này là rất quan trọng vì sự xuất hiện thường xuyên của Google khi ngoại tuyến. : o
Lee James

Bạn cần biết hiệu suất của chúng, các trường hợp sử dụng, v.v ... Biết cách thực hiện chúng bằng trái tim là điều chỉ được các công ty công nghệ yêu cầu trong các cuộc phỏng vấn.
sakisk

@PieterB, tôi không đồng ý. Người ta không cần biết về 'sáp nhập' và 'quicksort' với Google 'thuật toán sắp xếp hiệu suất tốt nhất'
hyankov

Câu trả lời:


117

Hãy hỏi Albert và xem anh ấy nói gì về chủ đề này:

Tôi không cần biết tất cả mọi thứ, tôi chỉ cần biết tìm nó ở đâu, khi tôi cần

- Albert Einstein , diễn giải

Amen, Anh Albert, Amen.

Khi bạn đã thực hiện một khảo sát tốt về các thuật toán thiết yếu trong bất kỳ chuyên ngành cụ thể nào (sắp xếp, tìm kiếm, bất cứ điều gì), bạn có thể quên đi các chi tiết triển khai cho đến khi bạn thực sự cần đến thuật toán, trong trường hợp bạn đi tìm hoặc sử dụng lib từ trước. 25 năm trước tôi đã xây dựng một hệ thống tìm kiếm lớn bằng B * -trees, nhưng hôm nay tôi sẽ cần RTFM để sử dụng chúng tốt.



9
Làm thế nào mà trả lời câu hỏi? Anh ấy nói rằng tôi không cần biết tất cả mọi thứ, anh ấy không nói rằng tôi không cần biết bất cứ điều gì. Một số kỹ năng là cơ bản, và toàn bộ câu hỏi là liệu một phần thông tin cụ thể có thuộc về loại kỹ năng cơ bản hay không.
Konrad Rudolph

1
Nghĩ rằng mục tiêu là ghi nhớ quicksort là bỏ lỡ điểm của câu hỏi. Tất nhiên, trong thế giới thực, nếu bạn cần một quicksort chung, bạn sẽ sử dụng thói quen thư viện hoặc tìm mã và sao chép nó. Bài kiểm tra là để xem bạn có hiểu đệ quy, bất biến vòng lặp, v.v. và yêu cầu bạn nhanh chóng ghi lại một thuật toán sắp xếp chỉ là một minh chứng thực sự đơn giản cho kiến ​​thức đó. Nếu bạn không có khả năng lấy lại quicksort 20 dòng ngay tại chỗ, có bao nhiêu việc bạn thường xuyên làm thực sự không hiệu quả hoặc không chính xác mà không hề biết?
Larry Gritz

3
@Larry: Tôi nghĩ rằng tôi đã quên nhiều hơn nhiều lập trình viên biết về các chi tiết của thuật toán - và sắp xếp nhanh từ đầu là một trong số đó - vì một lý do rất tốt - tôi đã chọn đọc lên những thứ cấp cao và sử dụng ngôn ngữ cấp cao hơn hơn ở lại trong bát của chi tiết thực hiện cấp thấp. Thành thật mà nói - Tôi không quan tâm đến việc sắp xếp thói quen thư viện mà tôi đang sử dụng - nó có thể sử dụng bụi pixy và các nàng tiên theo như tôi thấy. Tài liệu sẽ báo cho O () để định cỡ - đó là tất cả những gì tôi cần biết.
mattnz

2
@mattnz: Một phần tiếp theo hơi muộn đối với kích cỡ "O ()" của bạn. Một điều tôi học được một cách khó khăn là với một tập dữ liệu lớn, địa phương tham chiếu xấu hoàn toàn có thể áp đảo O (). Bạn có thể có một thuật toán O(n log n), nhưng nếu bạn nhận được rất nhiều lỗi bộ nhớ cache hoặc (Chúa cấm) bạn nhấn vào đĩa, thì đó n log nsẽ chỉ là một bộ nhớ thích.
Peter Rowell

49
  1. Nó không thực sự là một vấn đề ghi nhớ. Đó là vấn đề hiểu sâu sắc các lớp thuật toán chung như phân chia và chinh phục. Nếu bạn thực sự hiểu sự phân chia và chinh phục, thì bạn không cần phải ghi nhớ quicksort. Bạn có thể lấy lại nó ngay tại chỗ khi cần thiết. Hơn nữa, tiền chi trả thực sự thậm chí không thể tự mình lấy lại quicksort, mà bạn có thể nhận ra khi nào một vấn đề mới có thể chấp nhận được đối với giải pháp phân chia và chinh phục.

  2. Không phải tất cả các công việc lập trình đều giống nhau. Một số công việc cần có kiến ​​thức sâu sắc về thuật toán, một số công việc cần những người hiểu lý thuyết loại và một số chỉ cần những người có thể cạo dữ liệu từ một biểu mẫu web và chuyển nó sang cơ sở dữ liệu. Một số công việc thậm chí cần tất cả những kỹ năng đó cùng một lúc. Bạn muốn làm việc ở loại công việc nào?


5
Tôi không nghĩ có thể hiểu QuickSort mà không cần nhớ QuickSort. Đó không phải là một điều phức tạp và phức tạp, đó chỉ là hai ý tưởng chung được kết hợp. Điều tương tự cũng áp dụng cho sắp xếp hợp nhất, nhưng ở đó bạn chỉ có một ý tưởng: P
drxzcl

Tôi không đồng ý với điểm thứ 2. tất cả các công việc đều giống nhau, chỉ có người phỏng vấn thay đổi. Điều này biết sắp xếp rất tốt và nghĩ rằng mọi lập trình viên giỏi đều phải biết sắp xếp, bởi vì đó là tất cả những gì anh ta biết và quan tâm.
IAd CHƯƠNG

2
@IAd CHƯƠNG, chắc chắn bạn vui vẻ! Tôi biết từ kinh nghiệm của bản thân mình rằng kiến ​​thức và kỹ năng tôi cần cho công việc đầu tiên của tôi khi viết macro TROFF cho một công ty phần mềm thu nhỏ rất khác so với những gì tôi cần cho công việc hiện tại của mình trong phòng thí nghiệm sinh học tính toán.
Charles E. Grant

@ CharlesE.Grant hầu hết thời gian interviwer không kiểm tra xem bạn có kỹ năng nào cần thiết để thực hiện công việc của mình không (tôi không thể nhớ câu hỏi javascript / css cuối cùng tôi đã hỏi và tôi làm webapps).
IAd CHƯƠNG

10

Tôi nghĩ rằng lần duy nhất bạn cần nhớ tất cả là khi đi xin việc khi bạn phải đưa ra câu trả lời ngay tại chỗ và không có nguồn lực bên ngoài.

Tôi đã có đồng nghiệp viết lại quicksort và không có gì, nhưng tôi cứ bảo họ quay lại sử dụng các hàm sắp xếp được xây dựng trong ngôn ngữ. Tôi biết rằng tùy thuộc vào loại dự án nào chúng tôi làm việc, chúng tôi phải nhớ các thuật toán khác vì chúng thường không được bao gồm trong các thư viện tiêu chuẩn, nhưng sắp xếp không phải là một dự án xuất hiện vì nó thường được tích hợp vào ngôn ngữ.

Khi chúng ta cần phải nhớ các thuật toán đó, chúng ta thường chuyển sang google hoặc một cuốn sách và thông thường nó không tìm kiếm một triển khai cụ thể, nhưng điều gì sẽ là cách thực hiện tốt nhất cho vấn đề của chúng ta.


6

Chỉ cần nhớ thuật toán nào hữu ích trong các tình huống, sẽ là quá đủ để giúp đỡ trong quá trình làm việc của bạn. Trên thực tế, hầu hết các công việc lập trình không yêu cầu ghi nhớ cách tiếp cận, thay vào đó họ quan tâm đến cách nhận biết mô hình thuật toán của bạn khi gặp vấn đề .

Như một vấn đề thực tế, có rất nhiều thông tin trong hầu hết các blog / bài viết lập trình về các chủ đề thuật toán. Vì vậy, ghi nhớ thực hiện chính xác không mang tầm quan trọng. Hầu hết các thông tin có giá trị sẽ có được ý tưởng cơ bản về loại thuật toán có sẵn và vấn đề cụ thể nào là tốt trong việc giải quyết . Tìm kiếm để thực hiện chính xác một khi bạn biết những gì bạn đang tìm kiếm là khá nhanh.

Tóm lại, luôn luôn tốt hơn để biết những gì bạn tìm kiếm và các tài liệu tham khảo ở đâu - sẽ hướng dẫn bạn đến nguồn.


5

Việc thực hiện chính xác không quan trọng lắm. Nhưng nguyên tắc đằng sau sự hợp nhất / quicksort - đệ quy, phân vùng, v.v., là một điều rất cơ bản và mọi lập trình viên nên hiểu. Các thuật toán này thực sự rất đơn giản để mô tả bằng từ ngữ khi bạn hiểu.

Đây thực sự không phải là vấn đề về việc bạn có thể tra cứu nó hay bạn có thể google nó hay không, đó là liệu lập trình viên có hiểu các kỹ thuật giải quyết vấn đề này và có thể áp dụng cho các tình huống khác hay không.


3

Tôi có hai ý nghĩ về chủ đề này. Tôi biết nhiều lập trình viên không biết thuật toán sắp xếp là gì, nhưng làm công việc của họ khá tốt. Tôi cũng tin vào việc hiểu các nguyên tắc để thực sự hiểu được tên miền.

Thật khó cho tôi để có một câu trả lời không thiên vị về chủ đề này vì tôi đã lập trình quá lâu, có lẽ tôi đã quên nhiều thuật toán mà tôi hiện biết - nhưng tôi vẫn biết các câu hỏi sắp xếp được đề cập trong câu hỏi này. Tôi nghĩ rằng các nhà lãnh đạo tư tưởng trong Agile (ví dụ Ron Jeffries, Alistair Cockburn) có một số ý tưởng hay gần ý tưởng này (ví dụ Shu-Ha-Ri).

Tóm lại câu trả lời lan man này: Chắc chắn sử dụng API (NIH là dấu hiệu của sự non nớt của nhà phát triển), nhưng luôn hiểu các nguyên tắc cơ bản. Tôi hi vọng cái này giúp được.


2

Sắp xếp và tìm kiếm rất quan trọng, cho dù bạn là người hâm mộ Donald Knuth hay muốn trở thành Trang tiếp theo của Larry. Tùy thuộc vào doanh nghiệp bạn đang làm và mức độ cạnh tranh mà bạn có thể chỉ huy giữa các ứng cử viên của mình, tôi khuyên bạn nên đưa vào một số khái niệm sau trong cuộc phỏng vấn.

Sắp xếp

  • Phác thảo một số loại thuật toán sắp xếp.
  • Liệt kê một số ví dụ về thuật toán sắp xếp.
  • So sánh / tương phản hai loại với các đặc tính hiệu suất khác nhau.
  • Nếu họ không đề cập đến việc sử dụng bộ nhớ, hãy hỏi về nó.

Đang tìm kiếm

  • Đặt tên càng nhiều thuật toán tìm kiếm càng tốt.
  • So sánh / đối chiếu hai thuật toán tìm kiếm.
  • Phác thảo bất kỳ tìm kiếm nào khác ngoài tìm kiếm tuyến tính.

Một số người có thể nói rằng yêu cầu mã cho các thuật toán này là quá mức trừ khi công việc ở trên một hòn đảo hoang vắng không có kết nối internet. Một cân nhắc khác là nếu bạn có 30 phút và bạn muốn hỏi về bất cứ điều gì khác, đối với nhiều ứng viên, việc thực hiện sắp xếp có thể chiếm một phần lớn thời gian của bạn.


Tôi đã từng nghĩ việc yêu cầu mọi người lập trình trong các cuộc phỏng vấn là ngớ ngẩn, nhưng bạn sẽ không tin số người có bản lý lịch có vẻ tuyệt vời và trả lời các câu hỏi "xã hội" bằng màu sắc bay, nhưng ai, vì cuộc sống của họ, không thể ghi lại một triển khai chính xác của 'strcat' hoặc một số chức năng đơn giản khác. Nhiều lần điều này đã cứu tôi khỏi việc thuê ai đó, nếu không phải vì câu hỏi mã hóa ngớ ngẩn, có thể đã gây ra nỗi đau buồn vô tận và kéo cả đội xuống một cách bất tài.
Larry Gritz
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.