Các thuật toán cốt lõi được triển khai


307

Để chứng minh tầm quan trọng của các thuật toán (ví dụ với sinh viên và giáo sư không làm lý thuyết hoặc thậm chí từ các lĩnh vực hoàn toàn khác nhau) đôi khi rất hữu ích khi có sẵn một danh sách các ví dụ về thuật toán cốt lõi đã được triển khai trong thương mại, chính phủ, hoặc phần mềm / phần cứng được sử dụng rộng rãi.

Tôi đang tìm kiếm những ví dụ thỏa mãn các tiêu chí sau:

  1. Phần mềm / phần cứng sử dụng thuật toán nên được sử dụng rộng rãi ngay bây giờ.

  2. Ví dụ phải cụ thể. Vui lòng cung cấp một tài liệu tham khảo cho một hệ thống cụ thể và một thuật toán cụ thể.
    Ví dụ, trong "thuật toán X hữu ích cho xử lý ảnh", thuật ngữ "xử lý ảnh" không đủ cụ thể; trong "Tìm kiếm của Google sử dụng thuật toán đồ thị", thuật ngữ "thuật toán đồ thị" không đủ cụ thể.

  3. Thuật toán nên được dạy trong đại học điển hình hoặc tiến sĩ. các lớp trong thuật toán hoặc cấu trúc dữ liệu. Lý tưởng nhất, thuật toán được bao phủ trong sách giáo khoa thuật toán điển hình. Ví dụ: "hệ thống nổi tiếng X sử dụng thuật toán Y ít được biết đến" là không tốt.


Cập nhật:

Cảm ơn một lần nữa cho các câu trả lời và liên kết tuyệt vời! Một số người nhận xét rằng thật khó để đáp ứng các tiêu chí bởi vì các thuật toán cốt lõi có sức lan tỏa đến mức khó có thể chỉ ra một cách sử dụng cụ thể. Tôi thấy khó khăn. Nhưng tôi nghĩ rằng đáng để đưa ra các ví dụ cụ thể bởi vì theo kinh nghiệm của tôi nói với mọi người: "Hãy nhìn xem, thuật toán rất quan trọng vì chúng chỉ có ở khắp mọi nơi !" không hoạt động.


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Bjørn Kjos-Hanssen

Câu trả lời:


473

Theo tôi, các thuật toán là động lực chính đằng sau một hệ thống, dễ tìm thấy hơn trong các khóa học không phải là thuật toán với cùng lý thuyết với các ứng dụng ngay lập tức dễ tìm thấy hơn trong toán học ứng dụng thay vì các khóa học toán học thuần túy. Rất hiếm khi một vấn đề thực tế có cấu trúc chính xác của vấn đề trừu tượng trong một bài giảng. Để tranh luận, tôi thấy không có lý do tại sao tài liệu khóa học thuật toán thời trang như nhân của Strassen, kiểm tra tính nguyên thủy của AKS hoặc thuật toán Moser-Tardos có liên quan đến các vấn đề thực tế ở mức độ thấp khi triển khai cơ sở dữ liệu video, trình biên dịch tối ưu hóa, hệ điều hành , một hệ thống kiểm soát tắc nghẽn mạng hoặc bất kỳ hệ thống nào khác. Giá trị của các khóa học này là học được rằng có những cách phức tạp để khai thác cấu trúc của một vấn đề để tìm giải pháp hiệu quả. Các thuật toán nâng cao cũng là nơi người ta đáp ứng các thuật toán đơn giản mà phân tích của nó không tầm thường. Vì lý do này, tôi sẽ không loại bỏ các thuật toán ngẫu nhiên đơn giản hoặc PageRank.

Tôi nghĩ bạn có thể chọn bất kỳ phần mềm lớn nào và tìm các thuật toán cơ bản và nâng cao được triển khai trong đó. Như một trường hợp nghiên cứu, tôi đã thực hiện điều này cho nhân Linux và hiển thị một vài ví dụ từ Chromium.

Các cấu trúc dữ liệu và thuật toán cơ bản trong nhân Linux

Liên kết là mã nguồn trên github .

  1. Danh sách liên kết , danh sách liên kết đôi , danh sách liên kết không khóa .
  2. B + Cây có ý kiến ​​cho bạn biết những gì bạn không thể tìm thấy trong sách giáo khoa.

    Cách thực hiện B + Tree tương đối đơn giản. Tôi đã viết nó như một bài tập học tập để hiểu cách B + Cây hoạt động. Hóa ra cũng hữu ích.

    ...

    Một thủ thuật đã được sử dụng mà không thường thấy trong sách giáo khoa. Các giá trị thấp nhất là ở bên phải, không phải bên trái. Tất cả các vị trí được sử dụng trong một nút nằm ở bên trái, tất cả các vị trí không sử dụng đều chứa các giá trị NUL. Hầu hết các hoạt động chỉ đơn giản lặp một lần trên tất cả các vị trí và chấm dứt trên NUL đầu tiên.

  3. Danh sách sắp xếp ưu tiên được sử dụng cho mutexes , trình điều khiển , v.v.

  4. Cây đỏ-đen được sử dụng để lập lịch, quản lý bộ nhớ ảo, để theo dõi các mô tả tệp và mục nhập thư mục, v.v.
  5. Cây thời gian
  6. Cây Radix , được sử dụng để quản lý bộ nhớ , tra cứu liên quan đến NFS và chức năng liên quan đến mạng.

    Một cách sử dụng phổ biến của cây cơ số là lưu trữ các con trỏ tới các trang cấu trúc;

  7. Heap ưu tiên , theo nghĩa đen, là một triển khai sách giáo khoa, được sử dụng trong hệ thống nhóm kiểm soát .

    Heap ưu tiên kích thước tĩnh chỉ chèn đơn giản có chứa con trỏ, dựa trên CLR, chương 7

  8. Các hàm băm , có tham chiếu đến Knuth và một tờ giấy.

    Knuth khuyến nghị các số nguyên tố ở tỷ lệ vàng xấp xỉ với số nguyên tối đa có thể biểu thị bằng một từ máy để băm nhân. Chuck Lever đã xác minh tính hiệu quả của kỹ thuật này:

    http://www.citi.umich.edu/techreports/reports/citi-tr-00-1.pdf

    Các số nguyên tố này được chọn là thưa thớt một chút, đó là các thao tác trên chúng có thể sử dụng dịch chuyển và bổ sung thay vì nhân cho các máy có tốc độ nhân chậm.

  9. Một số phần của mã, như trình điều khiển này , thực hiện hàm băm của riêng họ.

    hàm băm sử dụng thuật toán Xoay Hash

    Knuth, D. Nghệ thuật lập trình máy tính, Tập 3: Sắp xếp và tìm kiếm, Chương 6.4. Addison Wesley, 1973

  10. Các bảng băm được sử dụng để thực hiện các nút , kiểm tra tính toàn vẹn của hệ thống tệp , v.v.
  11. Mảng bit , được sử dụng để xử lý cờ, ngắt, v.v. và được đặc trưng trong Knuth Vol. 4.

  12. Semaphoreskhóa spin

  13. Tìm kiếm nhị phân được sử dụng để xử lý ngắt , đăng ký tra cứu bộ đệm , v.v.

  14. Tìm kiếm nhị phân với cây B

  15. Độ sâu tìm kiếm đầu tiên và biến thể được sử dụng trong cấu hình thư mục .

    Thực hiện bước đi sâu đầu tiên được sửa đổi của cây không gian tên, bắt đầu (và kết thúc) tại nút được chỉ định bởi start_handle. Hàm gọi lại được gọi bất cứ khi nào một nút phù hợp với tham số loại được tìm thấy. Nếu hàm gọi lại trả về giá trị khác không, tìm kiếm bị chấm dứt ngay lập tức và giá trị này được trả về cho người gọi.

  16. Bề rộng tìm kiếm đầu tiên được sử dụng để kiểm tra tính chính xác của khóa khi chạy.

  17. Hợp nhất sắp xếp trên danh sách được liên kết được sử dụng để thu gom rác , quản lý hệ thống tệp , v.v.

  18. Sắp xếp bong bóng cũng được thực hiện một cách đáng kinh ngạc, trong một thư viện trình điều khiển.

  19. Kết hợp chuỗi Knuth-Morris-Pratt ,

    Thực hiện thuật toán khớp chuỗi thời gian tuyến tính do Knuth, Morris và Pratt [1]. Thuật toán của họ tránh được tính toán rõ ràng của hàm chuyển đổi DELTA hoàn toàn. Thời gian khớp của nó là O (n), với n là độ dài (văn bản), chỉ sử dụng hàm phụ trợ PI [1..m], với m là chiều dài (mẫu), được tính trước từ mẫu trong thời gian O (m). Mảng PI cho phép hàm chuyển đổi DELTA được tính toán một cách hiệu quả "nhanh chóng" khi cần thiết. Nói một cách đơn giản, đối với mọi trạng thái "q" = 0,1, ..., m và bất kỳ ký tự "a" nào trong SIGMA, giá trị PI ["q"] chứa thông tin độc lập với "a" và cần thiết để tính toán DELTA ("q", "a") 2. Vì mảng PI chỉ có m mục, trong khi DELTA có mục O (m | SIGMA |), chúng tôi lưu một hệ số của | SIGMA | trong thời gian tiền xử lý bằng cách tính PI chứ không phải DELTA.

    [1] Cormen, Leiserson, Rivest, Stein Giới thiệu về thuật toán, tái bản lần 2, MIT Press

    [2] Xem lý thuyết tự động hữu hạn

  20. Mẫu Boyer-Moore phù hợp với các tham chiếu và đề xuất khi nào nên chọn phương án thay thế.

    Triển khai thuật toán khớp chuỗi Boyer-Moore:

    [1] Thuật toán tìm kiếm chuỗi nhanh, RS Boyer và Moore. Truyền thông của Hiệp hội Máy móc Máy tính, 20 (10), 1977, tr. 762-772. http://www.cs.utexas.edu/users/moore/publications/fstrpose.pdf

    [2] Sổ tay thuật toán khớp chuỗi chính xác, Thierry Lecroq, 2004 http://www-igm.univ-mlv.fr/~lecroq/opes/opes.pdf

    Lưu ý: Vì Boyer-Moore (BM) thực hiện tìm kiếm các kết quả khớp từ phải sang trái, nên vẫn có thể kết hợp khớp trên nhiều khối, trong trường hợp đó thuật toán này sẽ không tìm thấy sự trùng hợp nào.

    Nếu bạn sẵn sàng đảm bảo rằng điều đó sẽ không bao giờ xảy ra, thay vào đó hãy sử dụng triển khai Knuth-Pratt-Morris (KMP). Để kết luận, chọn thuật toán tìm kiếm chuỗi thích hợp tùy thuộc vào cài đặt của bạn.

    Giả sử bạn đang sử dụng cơ sở hạ tầng tìm kiếm văn bản để lọc, NIDS hoặc
    bất kỳ mục đích tập trung bảo mật tương tự nào, sau đó đi KMP. Mặt khác, nếu bạn thực sự quan tâm đến hiệu suất, giả sử bạn đang phân loại các gói để áp dụng các chính sách Chất lượng dịch vụ (QoS) và bạn không bận tâm về các kết quả khớp có thể trải rộng trên nhiều mảnh, sau đó đi BM.

Cấu trúc dữ liệu và thuật toán trong trình duyệt web Chromium

Liên kết là mã nguồn trên mã Google . Tôi sẽ chỉ liệt kê một vài. Tôi sẽ đề nghị sử dụng tính năng tìm kiếm để tra cứu thuật toán hoặc cấu trúc dữ liệu yêu thích của bạn.

  1. Splay cây .

    Cây cũng được tham số hóa bởi một chính sách phân bổ (Allocator). Chính sách này được sử dụng để phân bổ danh sách trong cửa hàng miễn phí C hoặc khu vực; xem khu.h.

  2. Sơ đồ Voronoi được sử dụng trong một bản demo.
  3. Đánh dấu dựa trên thuật toán của Bresenham .
Ngoài ra còn có các cấu trúc dữ liệu và thuật toán như vậy trong mã của bên thứ ba được bao gồm trong mã Chromium.

  1. Cây nhị phân
  2. Cây đỏ-đen

    Kết luận của Julian Walker

    Cây đen đỏ là những con thú thú vị. Chúng được cho là đơn giản hơn cây AVL (đối thủ cạnh tranh trực tiếp của chúng) và thoạt nhìn có vẻ như đây là trường hợp vì việc chèn rất dễ dàng. Tuy nhiên, khi bắt đầu chơi với thuật toán xóa, cây đen đỏ trở nên rất khó khăn. Tuy nhiên, đối trọng với sự phức tạp được thêm vào này là cả việc chèn và xóa có thể được thực hiện bằng một thuật toán chuyển từ trên xuống. Đó không phải là trường hợp với cây AVL, trong đó chỉ có thể viết thuật toán chèn từ trên xuống. Xóa từ cây AVL yêu cầu thuật toán từ dưới lên.

    ...

    Cây đen đỏ là phổ biến, vì hầu hết các cấu trúc dữ liệu với một tên hay thay đổi. Ví dụ, trong Java và C ++, các cấu trúc bản đồ thư viện thường được triển khai bằng cây đen đỏ. Cây đen đỏ cũng có thể so sánh về tốc độ với cây AVL. Mặc dù cân bằng không hoàn toàn tốt, nhưng công việc cần thiết để duy trì sự cân bằng thường tốt hơn trong một cây đen đỏ. Có một vài quan niệm sai lầm trôi nổi xung quanh, nhưng phần lớn sự cường điệu về cây đen đỏ là chính xác.

  3. Cây AVL
  4. Kết hợp chuỗi Rabin-Karp được sử dụng để nén.
  5. Tính toán các hậu tố của một máy tự động .
  6. Bộ lọc Bloom được thực hiện bởi Apple Inc.
  7. Thuật toán của Bresenham .

Thư viện ngôn ngữ lập trình

Tôi nghĩ rằng chúng đáng để xem xét. Các nhà thiết kế ngôn ngữ lập trình nghĩ rằng nó đáng giá thời gian và công sức của một số kỹ sư để thực hiện các cấu trúc dữ liệu và thuật toán này để những người khác không phải làm. Sự tồn tại của các thư viện là một phần lý do chúng ta có thể tìm thấy các cấu trúc dữ liệu cơ bản được triển khai lại trong phần mềm được viết bằng C nhưng ít hơn cho các ứng dụng Java.

  1. Các STL C ++ bao gồm các danh sách, ngăn xếp, hàng đợi, bản đồ, vectơ, và các thuật toán để phân loại, tìm kiếm và thao tác đống .
  2. API Java rất rộng và bao gồm nhiều hơn nữa.
  3. Các thư viện Boost C ++ bao gồm các thuật toán như Boyer-Moore và Knuth-Morris-Pratt chuỗi kết hợp các thuật toán.

Thuật toán phân bổ và lập lịch

Tôi thấy những điều này thú vị bởi vì mặc dù chúng được gọi là heuristic, chính sách bạn sử dụng chỉ ra loại thuật toán và cấu trúc dữ liệu được yêu cầu, vì vậy người ta cần biết về ngăn xếp và hàng đợi.

  1. Ít nhất được sử dụng gần đây có thể được thực hiện theo nhiều cách. Một triển khai dựa trên danh sách trong nhân Linux.
  2. Các khả năng khác là First In First Out, Least thường được sử dụng và Round Robin.
  3. Một biến thể của FIFO đã được sử dụng bởi hệ thống VAX / VMS.
  4. Thuật toán Đồng hồ của Richard Carr được sử dụng để thay thế khung trang trong Linux.
  5. Bộ xử lý Intel i860 đã sử dụng chính sách thay thế ngẫu nhiên.
  6. Bộ đệm thay thế thích ứng được sử dụng trong một số bộ điều khiển lưu trữ của IBM và được sử dụng trong PostgreSQL mặc dù chỉ trong một thời gian ngắn do các vấn đề về bằng sáng chế .
  7. Các Buddy thuật toán cấp phát bộ nhớ , được thảo luận bởi Knuth trong TAOCP Vol. 1 được sử dụng trong nhân Linux và bộ cấp phát đồng thời jemalloc được sử dụng bởi FreeBSD và trong facebook .

Tiện ích cốt lõi trong các hệ thống * nix

  1. grepawk đều thực hiện việc xây dựng NFA của Thompson-McNaughton-Yamada từ các biểu thức chính quy, dường như thậm chí còn đánh bại việc thực hiện Perl .
  2. tsort thực hiện sắp xếp cấu trúc liên kết.
  3. fgrep thực hiện thuật toán khớp chuỗi Aho-Corasick.
  4. GNU grep , thực hiện thuật toán Boyer-Moore theo tác giả Mike Haertel.
  5. tiền điện tử (1) trên Unix đã triển khai một biến thể của thuật toán mã hóa trong máy Enigma.
  6. Unix diff được thực hiện bởi Doug McIllroy, dựa trên nguyên mẫu được viết cùng với James Hunt, hoạt động tốt hơn thuật toán lập trình động tiêu chuẩn được sử dụng để tính khoảng cách Levenshtein. Các phiên bản Linux tính chỉnh sửa khoảng cách ngắn nhất.

Thuật toán mật mã

Đây có thể là một danh sách rất dài. Các thuật toán mã hóa được triển khai trong tất cả các phần mềm có thể thực hiện giao tiếp hoặc giao dịch an toàn.

  1. Cây Merkle , cụ thể là biến thể Tiger Tree Hash, được sử dụng trong các ứng dụng ngang hàng như GTK GnutellaLimeWire .
  2. MD5 được sử dụng để cung cấp tổng kiểm tra cho các gói phần mềm và được sử dụng để kiểm tra tính toàn vẹn trên các hệ thống * nix ( triển khai Linux ) và cũng được hỗ trợ trên Windows và OS X.
  3. OpenSSL thực hiện nhiều thuật toán mã hóa bao gồm AES, Blowfish, DES, SHA-1, SHA-2, RSA, DES, v.v.

Trình biên dịch

  1. Phân tích cú pháp LALR được thực hiện bởi yacc và bison.
  2. Các thuật toán Dominator được sử dụng trong hầu hết các trình biên dịch tối ưu hóa dựa trên mẫu SSA.
  3. lexflex biên dịch các biểu thức chính quy thành NFA.

Nén và xử lý ảnh

  1. Các thuật toán Lempel-Ziv cho định dạng hình ảnh GIF được triển khai trong các chương trình xử lý hình ảnh, bắt đầu từ tiện ích * nix chuyển đổi sang các chương trình phức tạp.
  2. Chạy mã hóa chiều dài được sử dụng để tạo các tệp PCX (được sử dụng bởi chương trình Paint Brush gốc), các tệp BMP được nén và các tệp TIFF.
  3. Nén Wavelet là nền tảng cho JPEG 2000, vì vậy tất cả các máy ảnh kỹ thuật số tạo ra các tệp JPEG 2000 sẽ thực hiện thuật toán này.
  4. Sửa lỗi Reed-Solomon được triển khai trong nhân Linux , ổ đĩa CD, đầu đọc mã vạch và được kết hợp với tích chập để truyền hình ảnh từ Voyager.

Điều khoản học tập xung đột

Kể từ năm 2000, thời gian hoạt động của các bộ giải SAT trên điểm chuẩn công nghiệp (thường là từ ngành công nghiệp phần cứng, mặc dù các nguồn khác cũng được sử dụng) đã giảm gần như theo cấp số nhân mỗi năm. Một phần rất quan trọng của sự phát triển này là thuật toán Học thuật điều khoản xung đột kết hợp thuật toán Tuyên truyền ràng buộc Boolean trong bài báo gốc của Davis Logemann và Loveland với kỹ thuật học mệnh đề bắt nguồn từ lập trình hạn chế và nghiên cứu trí tuệ nhân tạo. Đối với mô hình công nghiệp cụ thể, SAT được coi là một vấn đề dễ dàng ( xem phần thảo luận này). Đối với tôi, đây là một trong những câu chuyện thành công lớn nhất trong thời gian gần đây vì nó kết hợp những tiến bộ thuật toán trải rộng trong nhiều năm, ý tưởng kỹ thuật thông minh, đánh giá thử nghiệm và nỗ lực phối hợp để giải quyết vấn đề. Các bài viết CACM bởi Malik và Zhang là một đọc tốt. Thuật toán này được dạy ở nhiều trường đại học (tôi đã tham dự bốn trường hợp như vậy) nhưng thường là trong một lớp phương pháp logic hoặc chính thức.

Các ứng dụng của người giải SAT rất nhiều. IBM, Intel và nhiều công ty khác có triển khai SAT của riêng họ. Trình quản lý gói trong OpenSUSE cũng sử dụng bộ giải SAT.


5
@HuckBennett, CDCL là một thuật toán được tham số hóa bởi heuristic nhưng bản thân nó không phải là một heuristic. Nó có hành vi theo cấp số nhân tồi tệ nhất nhưng nó không tầm thường để cho thấy điều đó. Hơn nữa, chúng ta không thể làm tốt hơn một cách rõ ràng và đó là điều tốt nhất chúng ta có thể làm trong thực tế, vì vậy tôi cảm thấy tất cả các nhà khoa học máy tính nên biết về nó! Đối với LRU, FIFO, v.v. chúng là các heuristic, nhưng, như với ARC, có thể yêu cầu các thuật toán thông minh hoặc cấu trúc dữ liệu để thực hiện.
Vijay D

9
Không phải một nhận xét như vậy đã được áp dụng cho Simplex: ban đầu không được hiểu rõ và sau đó được hiển thị theo cấp số nhân nhưng hoạt động trong thực tế và sau đó được chứng minh là có độ phức tạp được làm mịn đa thức? CDCL rất thú vị để phân tích thuật toán vì bạn cần trải qua độ phức tạp bằng chứng để rút ra các họ công thức thể hiện hành vi xấu nhất và cũng cho thấy nó có thể ngắn gọn hơn theo cấp số nhân so với một số biến thể của độ phân giải. Có nhiều phần mở rộng khác nhau, chẳng hạn như các kỹ thuật phá vỡ đối xứng và kỹ thuật tự động mà phân tích như vậy vẫn còn mở.
Vijay D

28
Đây là một kho báu cho một học sinh
neo1691

2
@EmanueleViola, tôi đã thêm một vài ví dụ nữa. Bài viết đã dài, vì vậy tôi không muốn mở rộng nó. Có lẽ bạn nên hỏi một câu hỏi mới cụ thể về việc triển khai các bộ lọc Dijkstra, Simplex, Bloom như một phần của hệ thống thực như Linux, Chrome, máy chủ web, v.v ... Tôi nghĩ rằng bạn có nhiều khả năng nhận được câu trả lời tốt nếu bạn cụ thể.
Vijay D

4
Hacker tin tức và r / lập trình.
Vijay D

40

PageRank là một trong những thuật toán nổi tiếng nhất như vậy. Được phát triển bởi nhà đồng sáng lập Google, Larry Page và đồng tác giả, nó đã hình thành nên cơ sở của công cụ tìm kiếm ban đầu của Google và được công nhận rộng rãi với việc giúp họ đạt được kết quả tìm kiếm tốt hơn so với đối thủ vào thời điểm đó.

Chúng tôi tưởng tượng một "người lướt ngẫu nhiên" bắt đầu từ một số trang web và liên tục nhấp vào một liên kết ngẫu nhiên để đưa anh ta đến một trang mới. Câu hỏi là "Người lướt sóng sẽ dành phần nào thời gian cho mỗi trang?" Người lướt càng dành nhiều thời gian cho một trang, trang đó càng được xem xét quan trọng.

Chính thức hơn, chúng tôi xem internet như một biểu đồ trong đó các trang là các nút và liên kết là các cạnh được định hướng. Sau đó chúng tôi có thể mô hình hành động của lướt sóng như một bước đi ngẫu nhiên trên một đồ thị hoặc tương đương như một chuỗi với ma trận chuyển đổi Markov . Sau khi xử lý một số vấn đề để đảm bảo Chuỗi Markov hoạt động tốt (người lướt sẽ đi đâu nếu một trang không có liên kết đi?), Chúng tôi tính lượng thời gian mà người lướt dành cho mỗi trang là phân phối trạng thái ổn định của Chuỗi Markov .M

Thuật toán tự nó có ý nghĩa tầm thường - chúng tôi chỉ tính cho phân phối ban đầu lớn và tùy ý . Điều này chỉ tương đương với phép nhân ma trận hoặc ma trận-vector lặp lại. Nội dung thuật toán chủ yếu ở phần thiết lập (đảm bảo tính linh hoạt, chứng minh rằng Chuỗi Markov ergodic có phân bố trạng thái ổn định duy nhất) và phân tích hội tụ (phụ thuộc vào khoảng cách phổ của ). k π 0 MMkπ0kπ0M


7
Tôi không nghĩ rằng đây là tài liệu thuật toán điển hình.
Manu

14
Tình cờ lần đầu tiên tôi biết về PageRank trong một lớp thuật toán. Trên thực tế, tôi nghĩ rằng giáo sư đã chọn nó bởi vì nó là một ví dụ hay về "thuật toán được sử dụng trong thực tế". Nếu bạn giới hạn các ví dụ ở loại vật liệu "nửa đầu của CLRS", danh sách các ví dụ sẽ quá dài hoặc quá tầm thường - thuật toán quicksort, B-cây và Dijkstra có mặt ở khắp nơi.
Huck Bennett

2
Chúng tôi dạy PageRank cho sinh viên đại học.
Aaron Roth

6
Tôi cũng dạy nó cho sinh viên đại học (cả trong lớp thuật toán cần thiết và trong một thuật toán đồ thị chuyên ngành hơn tự chọn).
David Eppstein

2
Tôi đã học PageRank như một đại học trong môn tự chọn.
Vijay D

33

Tôi sẽ đề cập đến việc triển khai phần mềm CPLEX (hoặc tương tự) được sử dụng rộng rãi của phương pháp / thuật toán Simplex để giải quyết các vấn đề lập trình tuyến tính. Đây là thuật toán (?) Được sử dụng nhiều nhất trong nghiên cứu kinh tế và hoạt động.

"Nếu người ta lấy số liệu thống kê về vấn đề toán học nào đang sử dụng phần lớn thời gian của máy tính trên thế giới, thì (không tính các vấn đề xử lý cơ sở dữ liệu như sắp xếp và tìm kiếm), câu trả lời có thể là lập trình tuyến tính. " (L. Lovász, Một người mới Thuật toán lập trình tuyến tính - tốt hơn hay kém hơn phương pháp đơn giản? Math. Intellectencer 2 (3) (1979/80) 141-146.)

Thuật toán Simplex cũng có ảnh hưởng lớn trong lý thuyết; xem, ví dụ, phỏng đoán Hirsch (đa thức) .

Tôi đoán một đại học điển hình hoặc tiến sĩ. lớp trong các thuật toán liên quan đến thuật toán Simplex (bao gồm các thuật toán cơ bản từ đại số tuyến tính như Phương pháp loại bỏ Gauss).

(Các thuật toán thành công khác, bao gồm Quicksort để sắp xếp, được liệt kê trong Thuật toán từ Sách .)


"Nghiên cứu kinh tế và hoạt động" không đủ cụ thể. CPLEX không phải là loại ví dụ mà tôi đang tìm kiếm, vì nó chỉ là một triển khai của thuật toán; Sẽ khác nếu trình biên dịch gcc sử dụng phương thức đơn giản.
Manu

12
Tôi nghĩ rằng "các vấn đề lập trình tuyến tính" là đủ cụ thể khi chúng ta nói về kinh tế và HOẶC. Ngoài ra, bởi CPLEX tôi có nghĩa là thuật toán đằng sau việc thực hiện.
vb le

16
"Ngày nay, hầu hết các công ty lớn sử dụng lập trình tuyến tính để định giá sản phẩm và quản lý chuỗi cung ứng. Các công ty vận tải sử dụng nó để chọn cách rẻ nhất để hợp nhất, điều phối và định tuyến vận chuyển nhiều sản phẩm từ các nhà cung cấp phân phối toàn cầu đến các thị trường xa bị hạn chế về năng lực. ngành công nghiệp sử dụng nó để thăm dò, pha trộn, lập kế hoạch sản xuất và phân phối. Ngành công nghiệp sắt thép sử dụng nó để đánh giá quặng sắt, khám phá việc bổ sung lò luyện cốc và chọn sản phẩm ... " news.stanford.edu/news/2005/may25/ dantzigobit-052505.html
Sasho Nikolov

Cảm ơn. Nhưng tôi thấy trích dẫn rất mơ hồ. Tôi nghĩ rằng nếu tôi nói rằng trước một lớp học sinh, một nửa số đó sẽ ngủ ;-) Sẽ khác nếu chúng ta nói điều gì đó như: UPS sử dụng LP để gửi các gói như sau ... Tôi không nói những ví dụ như vậy là tầm thường để tìm, nhưng cho rằng "hầu hết các công ty lớn sử dụng LP" tôi hy vọng chúng ta ít nhất có thể chỉ ra một .
Manu

10
Ra khỏi đầu tôi, từ năm 2007 LAX (sân bay) đã sử dụng phần mềm để giải các trò chơi Stackelberg để lên lịch cho nhân viên an ninh. Giải quyết các LP lớn là một phần của toàn bộ, xem ví dụ teamcore.usc.edu/ARMOR-LAX . Ngoài ra, tôi sẽ hỏi ai đó từ bộ phận Nghiên cứu hoạt động của bạn: họ thường sẽ có rất nhiều câu chuyện chiến tranh về việc sử dụng LP trong cuộc sống thực
Sasho Nikolov

30

Theo tôi hiểu, Chương trình kết hợp cư trú quốc gia trong một thời gian dài chỉ là một ứng dụng trực tiếp của thuật toán Gale-Shapley cho vấn đề hôn nhân ổn định. Kể từ đó, nó đã được cập nhật một chút để xử lý một số chi tiết bổ sung như bài tập vợ chồng (còn gọi là "vấn đề hai cơ thể"), v.v ...


Tôi không chắc chắn hôn nhân ổn định là vật liệu thuật toán điển hình.
Manu

16
Nó nằm trong sách Thiết kế thuật toán Tardos và Kleinberg, và cả trong Thuật toán ngẫu nhiên của Motwani, và cả hai cuốn sách đều được sử dụng rộng rãi. Hôn nhân ổn định có thể không được dạy phổ biến trong các khóa học thuật toán, nhưng chắc chắn nó được dạy ở rất nhiều trong số họ.
Sasho Nikolov

10
Một tìm kiếm nhanh chóng cho thấy rằng nó đã hiện diện trong CS70 Berkeley , MIT 6,042 , UMD của CMSC451 , vv ...
mhum

1
Thật thú vị, khi bạn thêm vào các bài tập vợ chồng, vấn đề sẽ trở thành NP hoàn chỉnh: arxiv.org/abs/1308.4534 . Tuy nhiên, trong thực tế, điều này dường như không gây ra quá nhiều vấn đề: en.wikipedia.org/wiki/iêu
Joshua Grochow

2
@EmanueleViola trong khi nó có thể không được đề cập theo truyền thống, việc đưa nó vào cuốn sách Kleinberg / Tardos đã khiến nó trở nên phổ biến hơn, (và nếu không thì nên!)
Suresh Venkat

24

Nếu bạn cũng bao gồm các công cụ cấp tiến sĩ, nhiều chương trình CS tốt nghiệp (hầu hết?) Bao gồm một số khóa học về lý thuyết mã hóa. Nếu bạn có một khóa học về lý thuyết mã hóa, bạn chắc chắn sẽ bao gồm mã Reed-Solomon không thể tách rời với cách thức hoạt động của đĩa compact và mã hóa Huffman được sử dụng trong các định dạng tệp JPEG, MP3 và ZIP. Tùy thuộc vào hướng của khóa học, bạn cũng có thể bao gồm Lempel-Ziv được sử dụng ở định dạng GIF. Cá nhân, tôi đã nhận được Lempel-Ziv trong một khóa học thuật toán đại học, nhưng tôi nghĩ rằng nó có thể không điển hình.


1
Và tôi đã có một bài giảng về mã hóa Huffman với tư cách là một sinh viên chưa tốt nghiệp, cần thiết cho một dự án.
Brian S

Huffman là một trong những chương đầu tiên của CLRS, vì vậy nó chắc chắn đủ điều kiện
Sasho Nikolov

21

GNU grep là một công cụ dòng lệnh để tìm kiếm một hoặc nhiều tệp đầu vào cho các dòng chứa khớp với mẫu đã chỉ định. Người ta biết rằng grep rất nhanh! Đây là một trích dẫn từ tác giả Mike Haertel (lấy từ đây ):

GNU grep uses the well-known Boyer-Moore algorithm, which looks first for the
final letter of the target string, and uses a lookup table to tell it how far
ahead it can skip in the input whenever it finds a non-matching character.

19

Tổng quát hơn, giải thưởng Kanellakis được ACM trao tặng cho những khám phá lý thuyết chính xác như vậy đã có tác động lớn trong thực tế.

giải thưởng năm 2012 dành cho băm nhạy cảm cục bộ , đã trở thành một phương pháp để giảm thiểu kích thước trong khai thác dữ liệu cho các vấn đề lân cận (và tương đối dễ dạy - ít nhất là chính thuật toán)


Tôi nghĩ rằng điều này là có thể dạy nhưng không được dạy rộng rãi.
Manu

3
Đáng tiếc, nhưng sự thật. Tuy nhiên, các biến thể của LSH (như bản phác thảo Count-min và người thân) đang bắt đầu xuất hiện trong các khóa học "dữ liệu lớn" hoặc "khai thác dữ liệu". Tôi dạy các bộ lọc nở trong lớp thuật toán của tôi, ví dụ.
Suresh Venkat

Theo kinh nghiệm cá nhân, LSH đã không mở rộng cho chúng tôi theo trường hợp "dữ liệu lớn" (các mặt hàng 100 triệu).
lynxoid

1
@lynxoid đó là một cuộc thảo luận / câu hỏi riêng biệt :). Có đủ ví dụ về nơi nó không làm việc mà tôi nghĩ rằng nó có liên quan đến câu hỏi cụ thể này.
Suresh Venkat

18

ε

Một số ví dụ về sử dụng công nghiệp của các cấu trúc dữ liệu này là:

  • Hệ thống Sawzall của Google để phân tích dữ liệu phi cấu trúc sử dụng Count Sketch để thực hiện chức năng 'các mặt hàng phổ biến nhất'
  • Hệ thống "cơ sở dữ liệu dòng" Gigascope của AT & T để giám sát lưu lượng mạng thực hiện bản phác thảo CountMin.
  • Hệ thống giám sát liên tục (CMON) của Sprint triển khai CountMin.

Đây cũng là một trang web thu thập thông tin về các ứng dụng của CountMin.

Theo như giảng dạy, tôi biết rằng các kỹ thuật phác thảo cơ bản được dạy tại Princeton trong các khóa học toán rời rạc. Tôi đã được dạy bản phác thảo CountMin trong khóa học thuật toán đầu tiên của mình. Trong mọi trường hợp, việc phân tích CountMin đơn giản hơn so với phân tích cho hầu hết mọi thuật toán ngẫu nhiên khác: đó là một ứng dụng đơn giản về tính độc lập theo cặp và bất đẳng thức của Markov. Nếu đây không phải là tài liệu tiêu chuẩn trong hầu hết các khóa học thuật toán, tôi nghĩ đó là vì lý do lịch sử.


1
Ví dụ tuyệt vời (mặc dù không hoàn toàn cốt lõi ngay bây giờ).
Manu

16

Trong thập kỷ qua, các thuật toán đã được sử dụng để tăng số lượng (và chất lượng, tôi nghĩ vậy?) Của các ca ghép thận thông qua các chương trình phù hợp với người hiến thận. Tôi đã gặp khó khăn khi tìm kiếm những tin tức mới nhất về điều này, nhưng đây là ít nhất một vài gợi ý:

  • Gần đây nhất là năm 2007, Liên minh quyên góp được sử dụng thuật toán của Áp-ra-ham, Blum và Sandholm . Họ có thể vẫn đang sử dụng nó, nhưng tôi không thể tìm ra bằng cách tìm kiếm trực tuyến. Mặc dù thuật toán này gần như chắc chắn không được đề cập trong các khóa học "tiêu chuẩn", nhưng nó kết hợp một số ý tưởng cơ bản chắc chắn được dạy trong các khóa học đó để cung cấp một thuật toán đủ tốt cho một vấn đề, nói chung, NP-Complete (một biến thể của Cover Cover ).

  • Cơ quan đăng ký thận quốc gia cũng sử dụng một số thuật toán tiêu chuẩn, bao gồm (tại một thời điểm) CPLEX. Điều này dẫn đến một chuỗi các ca cấy ghép thực sự liên kết với 60 người .

Đây là một trong những ví dụ yêu thích của tôi không chỉ về sự thành công của các thuật toán, mà còn về tầm quan trọng của việc nghiên cứu các thuật toán cho các vấn đề hoàn thành NP. Họ thực sự có thể cứu sống và đã làm như vậy!


Ngoài ra, một phiên bản đơn giản hơn của các thuật toán này được sử dụng để giao dịch các trò chơi trên bảng: okasaki.blogspot.co.uk/2008/03/what-heck-is-math-trade.html
Radu GRIGore

15

Thuật toán của Viterbi, vẫn được sử dụng rộng rãi trong nhận dạng giọng nói và nhiều ứng dụng khác: http://en.wikipedia.org/wiki/Viterbi_alacticm Bản thân thuật toán là lập trình động cơ bản.

Từ Wikipedia: "Thuật toán Viterbi được Andrew Viterbi đề xuất vào năm 1967 như là một thuật toán giải mã cho các mã chập qua các liên kết truyền thông kỹ thuật số ồn ào. [1] Thuật toán đã tìm thấy ứng dụng phổ biến trong việc giải mã các mã chập được sử dụng trong cả tế bào kỹ thuật số CDMA và GSM, modem quay số, vệ tinh, thông tin liên lạc trong không gian sâu và mạng LAN không dây 802.11. Hiện nay nó cũng thường được sử dụng trong nhận dạng giọng nói, tổng hợp giọng nói, phát hiện từ khóa, ngôn ngữ học tính toán và tin sinh học. Ví dụ, trong lời nói thành văn bản (lời nói nhận dạng), tín hiệu âm thanh được coi là chuỗi các sự kiện được quan sát và một chuỗi văn bản được coi là "nguyên nhân ẩn" của tín hiệu âm thanh. Thuật toán Viterbi tìm thấy chuỗi văn bản có khả năng nhất cho tín hiệu âm thanh. "


13
  1. A * được sử dụng trong nhiều Thiết bị Điều hướng Cá nhân (còn gọi là thiết bị GPS)
  2. A * được xác định rất rõ và đã được thực hiện khá đơn giản.
  3. A * không hoàn toàn tầm thường, nhưng nó không lấy bằng tiến sĩ. để hiểu nó

A * cũng thường xuyên được dạy trong thiết kế trò chơi. Tôi không nghĩ các trò chơi 3D hiện đại thường sử dụng A * cho điều hướng NPC, nhưng các trò chơi 2D / isometric, cũng như các trò chơi cũ hơn, sử dụng thuật toán.
Brian S

@BrianS Bạn có biết các ví dụ về thuật toán tìm đường được sử dụng trong trò chơi 3D, cụ thể là kẻ thù NPC trong trò chơi (chẳng hạn như npc bắn súng) Tôi nhớ đọc một cái gì đó như ... chia bản đồ trong các khu vực hình lục giác và sử dụng nó làm nút, thay vì hình vuông , và điều đó cho phép một phong trào mượt mà hơn.
Goodwine

@ Goodwine, Xin lỗi, tôi không có bất kỳ ví dụ thực tế nào về thuật toán tìm đường trong các trò chơi 3D. Trải nghiệm cá nhân của tôi là với các môi trường giống như "khối lập phương" (bản đồ được tạo thành từ các hình khối, nhân vật đứng trên - về cơ bản là 2D, mặc dù kết xuất 3D) và AI giả được sử dụng để thử nghiệm các nhân vật của người chơi.
Brian S

12

Hãy xem dự án BonTools của Jens Vygen cho Thiết kế Chip. http://www.or.uni-bonn.de/~vygen/projects.html Tôi đã nghe một số cuộc nói chuyện về điều này và cũng đã xem xét một số bài báo của họ. Họ sử dụng phương pháp làm tròn ngẫu nhiên theo kiểu Raghavan-Thompson cũng như phương pháp cập nhật trọng số nhân để giải quyết LP lưu lượng đa dòng quy mô lớn. Tuy nhiên, giống như bất kỳ dự án lớn nào, họ cũng cần phải thực hiện một số kỹ thuật nhưng phương pháp này dựa rất nhiều vào các thuật toán nổi tiếng.


Tôi sẽ có một cái nhìn nhưng nó không giống như tài liệu thuật toán điển hình.
Manu

8
Hmm, làm tròn ngẫu nhiên thường được dạy trong các khóa học thuật toán cấp tiến sĩ, không?
Chandra Chekuri

2
Tại sao chỉ làm tròn ngẫu nhiên? Sanjeev Arora, Elad Hazan và Satyen Kale nghĩ rằng phương pháp cập nhật trọng lượng mulplicative là đủ cơ bản để được dạy ở cấp độ UG :) "Chúng tôi cảm thấy rằng thuật toán meta và phân tích của nó đủ đơn giản và hữu ích để chúng được xem như một công cụ cơ bản được dạy cho tất cả các học sinh cùng với thuật toán phân chia, lập trình động, lấy mẫu ngẫu nhiên và tương tự. " (xem cs.princeton.edu/~arora/pub/MWsurvey.pdf ).
Jagadish


10

Tôi khá ngạc nhiên khi với tất cả các thuật toán ưa thích ở trên, không ai đề cập đến họ thuật toán nén Lempel-Ziv đáng kính (được phát minh vào năm 1977/78).

  1. Chúng được sử dụng ở mọi nơi - văn bản thành hình ảnh để xử lý luồng. Hoàn toàn có khả năng LZ * là một họ thuật toán được sử dụng nhiều nhất trong sự tồn tại.
  2. Nén từ điển là một bước đột phá đáng kể trong lý thuyết nén và một sự khởi đầu mạnh mẽ từ cách tiếp cận theo phong cách Shannon-Fano.
  3. Các thuật toán trong gia đình khá đơn giản và dễ hiểu.

Cập nhật

Rõ ràng nó đã được đề cập ngắn gọn rồi.


10

Phân rã giá trị số ít (SVD) có mối liên hệ chặt chẽ với phân tích nhân tố thống kê hoặc phân tích thành phần chính và có thể hiểu được trong một lớp đại số tuyến tính hoặc lớp thống kê, và có nhiều tính chất lý thuyết quan trọng. nó cũng đóng một vai trò trong các thuật toán nén hình ảnh. nó đã đóng một yếu tố quan trọng trong các mục chiến thắng trong cuộc thi giải thưởng Netflix trị giá 1 triệu đô la (một trong những cuộc thi dữ liệu lớn nhất thế giới trong lịch sử) và hiện được triển khai trên trang web của họ để dự đoán xếp hạng của người dùng. nó cũng được biết là có liên quan cao đến các mạng lưới thần kinh tự tổ chức của người Do Thái bắt nguồn từ lý thuyết sinh học.

cũng có một số mối liên hệ với độ dốc gốc được sử dụng rộng rãi trong các mạng thần kinh nhân tạomáy học và như một kỹ thuật tối ưu hóa được áp dụng rất phổ biến trong đó phương pháp của Newton là dạng 2d cơ bản. có một thuật toán giảm độ dốc để lấy SVD.


10

Tìm một con đường Euler là cơ sở của bộ gen - một nhiệm vụ thường được thực hiện khi làm việc với bộ gen đầy đủ (trong tin sinh học, y học, pháp y, sinh thái học).

CẬP NHẬT Quên điều hiển nhiên này: UPS, FedEx, USPS đều phải giải quyết các vấn đề lớn về vấn đề nhân viên bán hàng du lịch mỗi đêm. Tiết kiệm rất nhiều thời gian và tiền bạc để họ gửi các trình điều khiển trên một tuyến đường tối ưu.

CẬP NHẬT2 Vấn đề đặt đỉnh phản hồi tối thiểu được sử dụng cho độ phân giải bế tắc trong nhiều hệ điều hành.


Bạn có chắc TSP là vấn đề mà các công ty chuyển phát bưu kiện đang cố gắng giải quyết? Tôi nghĩ rằng một thách thức thực tế lớn hơn là ba lô và các loại vấn đề đóng gói khác.
András Salamon

Nhiệm vụ cho các tài xế thay đổi mỗi ngày (ví dụ, anh chàng UPS không cần phải đến cùng một nhà mỗi ngày), vì vậy các tuyến đường phải được cập nhật hàng ngày. Đó không phải là một TSP thuần túy - có các ràng buộc bổ sung như đường một chiều, không quay đầu xe, giao các gói hàng ở một bên đường, nhưng không phải là các đường khác.
lynxoid

Tôi chắc chắn đóng gói cũng quan trọng mặc dù.
lynxoid

9

Tôi thích hệ thống này vì đã cứu được số lượng cuộc sống tối đa ở Anh bằng ghép thận, dựa trên các thuật toán phù hợp tối đa: Hiến thận ghép đôi và vị tha . Họ phù hợp với những người cần thận có người bạn / người thân không phù hợp sẵn sàng hiến tặng, với những người khác có cùng hoàn cảnh, theo cách tối đa. Sau đó vào ngày quyên góp, tất cả các nhà tài trợ quyên góp cùng một lúc, tiếp theo là vận chuyển thận nhanh chóng trên khắp đất nước cho người nhận.


8

cuốn sách tương đối mới này đáng để xem là một câu trả lời đầy đủ / chi tiết cho câu hỏi ở dạng thuận tiện, mở rộng / thu thập và có thể được sử dụng làm tài liệu bổ sung cho lớp thuật toán. [một số trong số này đã được đề cập; sự chồng chéo mạnh mẽ là đáng chú ý.]


Lần giới thiệu thứ 2 có nguồn gốc từ tháng 1 / tháng 2 năm 2000 về Máy tính trong Khoa học & Kỹ thuật, một ấn phẩm chung của Viện Vật lý Hoa Kỳ và Hiệp hội Máy tính IEEE. được biên soạn bởi các biên tập viên khách mời Jack Dongarra của Đại học Tennessee và Phòng thí nghiệm quốc gia Oak Ridge và Francis Sullivan thuộc Trung tâm khoa học máy tính tại Viện phân tích quốc phòng
vzn

7

Các Knuth-Morris-Pratt chuỗi tìm kiếm được sử dụng rộng rãi, cụ thể và giảng dạy trong undergrad / tốt nghiệp CS.


2
Sẽ tốt nếu bạn có thể chỉ ra một cách sử dụng cụ thể. Một cái gì đó giống như MS Word sử dụng KMP.
Manu

6

Suy nghĩ về các thuật toán rất cơ bản

  1. Trình tạo số ngẫu nhiên được tìm thấy ở mọi nơi và đặc biệt trong tất cả các trò chơi.
  2. Cơ sở dữ liệu bao gồm nhiều thuật toán, bao gồm B +, Băm, hàng đợi ưu tiên, biểu thức chính quy, mã hóa, sắp xếp, v.v ... Một người bạn của tôi nói rằng SGBD đứng đầu chuỗi thực phẩm điện toán.
  3. Sắp xếp được sử dụng ở mọi nơi, ví dụ như trong Excel. Nó thực sự được sử dụng mọi lúc trong cuộc sống thực, nhưng thông thường con người sử dụng thuật toán đặc biệt
  4. Các bit chẵn lẻ được sử dụng xung quanh
  5. Mã hóa Huffman nằm trong phần mềm nén và truyền
  6. Ngăn xếp (LIFO) được sử dụng ở mọi nơi. Bên trong các ngôn ngữ lập trình, trong CPU, v.v ...

Rất vui khi thấy họ xuất hiện ngoài đời thực:

A. Nhiều nhóm sử dụng một loại thuật toán che phủ cây để liên lạc, bằng cách chia danh sách điện thoại theo cách phân cấp giữa mọi người B. Ô tô trong giao lộ thường sử dụng thuật toán quay vòng (theo cách tự nguyện) C. Hầu hết các địa điểm, như ngân hàng và bệnh viện, tổ chức khách hàng của họ trong một thuật toán FIFO


4
Sắp xếp không phải là một thuật toán. Đó là một nhiệm vụ, nghĩa là, một cái gì đó bạn muốn thực hiện, mà bạn phải thiết kế (hoặc, trong thực tế, chọn) một thuật toán.
David Richerby

Đây dường như không phải là ví dụ cụ thể theo yêu cầu trong câu hỏi.
Kaveh

SGBD == RDBMS FYI cho những người không biết.
Tự động nhận

6

Một vấn đề thuật toán hấp dẫn phát sinh trong ứng dụng y tế của CT scan. Trong Chụp cắt lớp điện toán (CT), cơ thể được tiếp xúc với tia X từ các góc khác nhau. Ở một đầu của máy quét là các máy phát tia X và ở đầu kia là các cảm biến. Từ một loạt các lần quét như vậy, một hình ảnh được xây dựng lại để các bác sĩ kiểm tra!

Các lọc lại chiếu thuật toán là cơ sở để xây dựng lại một hình ảnh từ một bộ quét. Thuật toán này thực sự là một dạng của một vấn đề gần đúng trong đó "tín hiệu" được lấy mẫu dưới tốc độ Nyquist. Thuật toán này được sử dụng "đằng sau hậu trường" tại tất cả các bệnh viện và phép chiếu ngược được lọc cơ bản sử dụng toán học đại học như biến đổi Fourier để đạt được Định lý Slice Fourier .


6

Một ví dụ về FFT

Tôi đã từng giúp chuyển một thuật toán FFT sang một ngôn ngữ hệ thống khác.

Thuật toán đã được sử dụng để xác định ngắt dòng trong phân phối đồng trục của truyền hình cáp / internet / điện thoại. Về cơ bản, một kỹ thuật viên sẽ yêu cầu gửi tín hiệu đến hộp của khách hàng, đồng thời họ sẽ hiển thị số liệu thống kê theo thời gian thực cho khách hàng cụ thể, như QoS, dB, .... Kỹ thuật viên có thể sử dụng dữ liệu và biểu đồ để xác định trong một vài feet giữa nhà và cực nơi tồn tại một phần phá vỡ (hoặc nhiều lần phá vỡ như tôi đã nói).

Như đã đề cập ở trên FFT được sử dụng rộng rãi, nhưng đây là một trong những điều rõ ràng và rõ ràng hơn (về lý do tại sao và như thế nào) tôi đã thấy trong thực tế.

Xin lỗi tôi đã phải giữ nó ở mức cao.


5

Thuật toán dòng của Bresenham là thuật toán hữu ích nhất mà tôi đã gặp. Dễ hiểu Ive đã sử dụng nó cho rất nhiều ứng dụng từ vẽ đường thẳng đến bộ chia phức tạp cho công cụ đúc 3d đến trình kết xuất đa giác phức tạp, cũng như cho các hoạt động sử dụng và chia tỷ lệ phức tạp.



2

Wikipedia có một bộ sưu tập tốt các thuật toán / ứng dụng được phân loại ít nhiều trong một danh sách . Microsoft cung cấp các bài báo được trích dẫn hàng đầu nhưng không có bất kỳ lời giải thích rõ ràng nào về lĩnh vực khoa học máy tính cũng như ứng dụng. Ngoài ra còn có một danh sách theo thời gian từ các hội nghị CS khác nhau _http: //jeffhuang.com/best_apers_awards.html_ do Giáo sư Huang biên soạn.

Spectral Clustering là một thuật toán phân cụm thanh lịch, được biết đến là thuật toán cắt chuẩn hóa được giới thiệu bởi Jianbo Shi và Jitendra Malik cho phân đoạn hình ảnh. Nó cũng đã được phát triển trong các ứng dụng phân cụm dữ liệu, là một giao điểm tốt giữa hai cộng đồng.


-2

hai ví dụ yêu thích cá nhân khác bắt nguồn từ khoa học máy tính nhưng có thể dễ dàng bị bỏ qua bởi các nhà lý thuyết trừu tượng, đã trải qua những tiến bộ to lớn / biến đổi và có tác động thực tiễn / ứng dụng lớn trong cuộc sống hàng ngày trong vài thập kỷ qua. đã có cả một thế hệ lớn lên không biết thế giới mà không có họ. về cơ bản là thể loại Mô hình hóa và mô phỏng .

  • thuật toán mô phỏng vật lý . chủ yếu sử dụng định luật Newton nhưng sử dụng các định luật khác (như động lực học chất lỏng). được sử dụng trong rất nhiều ứng dụng khác nhau, từ các ứng dụng kỹ thuật, trò chơi video và đôi khi là phim ảnh. điều này cũng chịu trách nhiệm cải thiện đáng kể sự an toàn, hiệu quả hoặc độ tin cậy của xe hơi và máy bay thông qua việc áp dụng các thiết kế ảo / thử nghiệm cho các ứng suất mô phỏng. một lĩnh vực nghiên cứu đang diễn ra liên quan chính từ tin sinh học với ý nghĩa to lớn trong sinh học, ví dụ như thiết kế thuốc, phòng chống bệnh tật, vv: dự đoán cấu trúc / gấp protein . cũng lưu ý rằng giải thưởng Nobel về hóa học năm nay đã được trao cho mô phỏng hóa học cho Karplus, Levitt, Warshel. thuật toán mô phỏng vật lý có liên quan nhiều đến thử nghiệm / an toàn vũ khí hạt nhân ví dụ tại phòng thí nghiệm Los Alamos.

  • thuật toán raytracing / CGI . điều này bắt đầu như một chủ đề nghiên cứu chỉ vài thập kỷ trước [một người bạn có bằng thạc sĩ về thuật toán viết tia CS] nhưng đã trở nên rất được áp dụng trong các trò chơi và kinh doanh làm phim, đạt đến mức độ chân thực phi thường chịu trách nhiệm cho số lượng lớn hiệu ứng đặc biệt trong phim. các ngành công nghiệp này đã đầu tư hàng tỷ đô la và thực hiện các thuật toán này và toàn bộ các tập đoàn lớn đều dựa trên việc khai thác chúng, ví dụ Pixar . chủ yếu được sử dụng ban đầu trong các phim scifi, kỹ thuật này hiện đang phổ biến đến mức nó được sử dụng thường xuyên ngay cả trong các phim "điển hình". ví dụ gần đây The Great Gatsby phụ thuộc rất nhiều vào hiệu ứng CGI để vẽ môi trường thuyết phục hoặc cách điệu, chỉnh sửa phim / nhân vật, v.v.


-3

Mã Rosetta liệt kê các thuật toán được áp dụng theo Nhiệm vụ lập trình (692) và Ngôn ngữ lập trình (518) với MediaWiki Semantic.


Làm thế nào đây là một ví dụ về "các thuật toán cốt lõi ... được triển khai trong phần mềm / phần cứng thương mại, chính phủ hoặc được sử dụng rộng rãi"?
David Richerby

Sẽ rất hữu ích khi tham chiếu chéo các triển khai của từng thuật toán xuất sắc được liệt kê trong các câu trả lời khác ở đây cho Wikipedia / DBpedia URI. Không có URI Wikipedia / DBpedia cho tất cả các thuật toán này; nhưng có các trang Rosetta Code.
Wes Turner

bigochcoateet.com cũng liệt kê độ phức tạp của Big-O và các liên kết đến các bài viết trên Wikipedia cho khá nhiều thuật toán.
Wes Turner

Câu hỏi yêu cầu các ví dụ về các thuật toán cốt lõi được sử dụng trong các phần mềm quan trọng. "Đây là một trang web với các thuật toán được triển khai bằng một triệu ngôn ngữ" hoàn toàn không trả lời câu hỏi đó. Trên thực tế, nó hoàn toàn trái ngược với những gì câu hỏi đang tìm kiếm.
David Richerby

Một tài liệu tham khảo hữu ích, theo ngữ cảnh dù sao.
Wes Turner

-5

có lẽ tất cả các thuật toán quan tâm / ưa thích đối với đối tượng này đã được đề cập tại thời điểm này. tuy nhiên, một vài đề cập xứng đáng hơn cho sự hoàn chỉnh. & một số phân tích về những gì được coi là một thuật toán quan trọng có liên quan ở đây.

trong các lĩnh vực CS & IT dường như có một hiện tượng được chú ý từ lâu trong AI có tên là "di chuyển các cột gôn" . Đây là một hiện tượng tâm lý trong đó lĩnh vực tiến bộ tương đối nhanh chóng nhưng mọi người nhanh chóng điều chỉnh về mặt "bình thường mới" và có những tiến bộ thực sự hoặc thậm chí đột phá như trần tục hoặc không đáng kể khi nhìn lại, sau khi hoàn thành, tức là bị giảm hoặc giảm thiểu. điều này được đánh giá cao trong câu hỏi này theo cách các thuật toán chuyển từ R & D sang "triển khai". trích dẫn tác giả của câu hỏi trong các bình luận sau:

Trong thực tế, một phần không đáng kể của tất cả các mã được viết đang thực hiện bất cứ điều gì thú vị theo quan điểm thuật toán.

nhưng điều này là có vấn đề và về cơ bản là một định nghĩa lại trung tâm TCS của từ "thuật toán". có lẽ các thuật toán thú vị là tiên tiến. điều đó có nghĩa là nếu một vấn đề được giảm xuống thành một thuật toán nâng cao, nó không còn "thú vị" nữa? và "nâng cao" rõ ràng là một mục tiêu di động. vì vậy có một cách để định nghĩa "thuật toán" trong phạm vi hẹp hoặc rộng . có vẻ như định nghĩa TCS thay đổi theo ngữ cảnh, nhưng lưu ý ngay cả trong TCS, có một xu hướng về định nghĩa rộng, ví dụ như trong "ống kính thuật toán" .

đôi khi các thuật toán phổ biến nhất cũng bị bỏ qua nhất! Internet và WWW là một môi trường rộng lớn / gần sinh thái cho các thuật toán. vẫn còn khá trẻ chỉ khoảng 2 thập kỷ (được phát minh ~ 1991) nó đã phát triển ồ ạt và theo cấp số nhân trong một khoảng thời gian ngắn. Tăng trưởng trang WWW có lẽ thậm chí đã vượt xa luật Moores theo cấp số nhân nổi tiếng.

Internet / WWW được hỗ trợ bởi nhiều thuật toán tinh vi. Internet có các thuật toán định tuyến phức tạp được tích hợp trong các bộ định tuyến (một lần nữa cung cấp năng lượng cho các tập đoàn trị giá hàng tỷ đô la như Cisco). một số lý thuyết nâng cao được áp dụng ở đó, ví dụ như trong các thuật toán định tuyến . những thuật toán này là một chủ đề của nghiên cứu tiên tiến, tiên tiến / tiên tiến trong nhiều thập kỷ trước, tuy nhiên giờ đây đã được hoàn thiện và hiểu rõ rằng nó có phần vô hình.

chúng ta không nên sớm quên rằng nhiều thập kỷ trước, các nhà nghiên cứu hàng đầu thậm chí không chắc liệu thế giới internet có hoạt động hay không (có thể thấy trong nghiên cứu chuyển mạch gói đầu tiên, một mẫu thiết kế mới triệt để tại thời điểm chuyển mạch trước đó) và thậm chí một vài năm trước đây đã có những lo ngại rằng nó sẽ không mở rộng quy mô tại một số điểm và bắt đầu thất bại do tăng đột biến về khối lượng.

nó cũng sử dụng phát hiện / sửa lỗi tinh vi . Internet có lẽ là hệ thống lớn nhất, có khả năng chịu lỗi nhất từng được con người xây dựng, vẫn đang phát triển.

tiếp theo, có một trường hợp mạnh mẽ để làm cho các thuật toán cung cấp năng lượng cho WWW được nâng cao. Máy chủ HTTP & web được điều chỉnh / tối ưu hóa cao và cũng sử dụng các giao thức bảo mật / mã hóa (HTTPS) tiên tiến. logic kết xuất của một trang web đã trở nên cực kỳ tiên tiến trong HTML5 & CSS3 , cùng với ngôn ngữ lập trình Javascript .

CSS tương đối mới có các nguyên tắc khác nhau tương tự như lập trình OOP như khả năng sử dụng lại và kế thừa. Nói về sắp chữ, TeX là một hệ thống sắp chữ khoa học quan trọng, phức tạp bên trong (không khác gì ngôn ngữ lập trình) do Knuth phát minh mà giờ đây có thể được hiển thị trên các trang web (và được sử dụng trong hàng trăm ngàn bài báo khoa học trở lên).

một lĩnh vực tương đối mới của các thuật toán xây dựng trên internet, vẫn đang nổi lên, những thuật toán dựa trên trí tuệ tập thể . Bản thân phần mềm stackexchange là một ví dụ về một hệ thống trí tuệ tập thể tinh vi. Mạng xã hội cũng thể hiện các tính năng chính của trí tuệ tập thể và các tính năng liên tục được thêm vào để tăng trí thông minh đó (ví dụ: "Thích" trên facebook chỉ mới vài năm). lĩnh vực hệ thống xếp hạng dựa trên các thuật toán lọc cộng tác và vẫn đang phát triển dựa trên nghiên cứu và ứng dụng mới.

Vì vậy, trong ngắn hạn, tất cả các thành công mang tính cách mạng làm thay đổi trải nghiệm hàng ngày của con người thực sự vượt xa "mục tiêu thực địa". như tiêu đề của các trạng thái câu hỏi, tất cả các thuật toán cốt lõi được triển khai . bây giờ rất phổ biến và vô hình như là một thứ giống như biểu hiện CNTT, "một phần của hệ thống ống nước".


nhiều trích dẫn có thể được thêm vào này. đây là một khởi đầu: DARPA và cuộc cách mạng internet của Waldrop
vzn

một giới thiệu khác về tối ưu hóa internet, tiểu sử của Daniel Lewin , đồng sáng lập của akamai, "thiên tài đã biến đổi internet"
vzn

-8

Một thuật toán (phần cứng) thành công đáng kinh ngạc là thiết lập lại bật nguồn.

Không có một hệ thống theo đó một máy tính ở trạng thái đã biết khi cấp nguồn, không có gì khác xảy ra .

Thiết lập lại bật nguồn là lý do tại sao mọi thứ đều hoạt động với CPU, cho dù được xem là nhúng hay không.

Lần tới khi bạn đang ở lỗ tưới nước cho các lập trình viên và các nhà khoa học máy tính, hãy nâng ly soda cherry của bạn lên thiết lập lại bật nguồn.


5
Thiết lập lại bật nguồn không phải là một thuật toán. Đó là một nhiệm vụ, tức là, một cái gì đó bạn muốn thực hiện, mà bạn phải thiết kế một thuật toán.
David Richerby
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.