Các thuật toán từ cuốn sách.


358

Paul Erdos đã nói về "Cuốn sách" nơi Chúa giữ bằng chứng thanh lịch nhất cho mỗi định lý toán học. Điều này thậm chí đã truyền cảm hứng cho một cuốn sách (mà tôi tin rằng hiện đang ở phiên bản thứ 4 của nó): Bằng chứng từ cuốn sách .

Nếu Chúa có một cuốn sách tương tự cho các thuật toán, bạn nghĩ thuật toán nào sẽ là một ứng cử viên?

Nếu có thể, vui lòng cung cấp một tài liệu tham khảo có thể nhấp và (các) thông tin chi tiết chính giúp nó hoạt động.

Chỉ có một thuật toán cho mỗi câu trả lời.


11
Câu hỏi tuyệt vời! [Chỉnh sửa:} Một câu hỏi. Nơi nào chúng ta vẽ ranh giới giữa các thuật toán và cơ sở dữ liệu? Điều gì xảy ra nếu cái nhìn sâu sắc quan trọng đối với thuật toán có liên quan mật thiết đến cơ sở hạ tầng (ví dụ UNION FIND trong hàm Ackermann nghịch đảo)?
Ross Snider

4
một nguồn tuyệt vời và có thể là ứng cử viên cho một cuốn sách như vậy là "Bách khoa toàn thư về thuật toán" springer.com/computer/theorory+computer+science/book/ phỏng
Marcos Villagra

21
Tôi hơi ngạc nhiên khi các thuật toán mà tôi cho là khá phức tạp (KMP, mảng hậu tố tuyến tính) được những người khác coi là "từ Sách". Đối với tôi, "từ cuốn sách" có nghĩa là đơn giản và rõ ràng, nhưng chỉ với nhận thức muộn màng. Tôi tò mò làm thế nào người khác giải thích "thanh lịch".
Radu GRIGore

49
@supercooldave Bạn không cần phải tin vào Chúa, nhưng bạn nên tin vào cuốn sách của anh ấy. ;-)
Ross Snider

10
Trong một bài giảng năm 1985, Erdős nói: "Bạn không cần phải tin vào Chúa, nhưng bạn nên tin vào Sách."
Robert Massaioli

Câu trả lời:


116

Union-find là một vấn đề hay mà thuật toán / cơ sở hạ tầng tốt nhất ( Disjoint Set Forest ) dựa trên một chồng spaghetti. Mặc dù rất đơn giản và đủ trực quan để giải thích cho một đứa trẻ thông minh, phải mất vài năm để có được sự ràng buộc chặt chẽ về thời gian chạy của nó. Cuối cùng, hành vi của nó được phát hiện có liên quan đến Chức năng Ackermann nghịch đảo, một chức năng mà khám phá của ông đã đánh dấu một sự thay đổi trong quan điểm về tính toán (và thực tế được bao gồm trong On the Infinite của Hilbert ).

Wikipedia cung cấp một giới thiệu tốt về Disjoint Set Forests .


109

Kết hợp chuỗi Knuth-Morris-Pratt . Tám dòng mã nhỏ nhất mà bạn từng thấy.


4
Tâm trí của chúng tôi không thể nhận ra rằng đó là điều không rõ ràng vào một lúc nào đó và bây giờ chỉ rõ ràng vì họ đã nghĩ ra nó và chúng tôi đã học được ... Tôi nghĩ rằng chúng ta nên áp dụng lý thuyết lịch sử của Carr vào Toán học và Khoa học Máy tính .
Ritwik Bose

1
Theo mô tả, tôi muốn nói rằng điều này có liên quan đến tìm kiếm chuỗi con nhanh Boyer-Moore.
bart

2
@Mechko Việc thuật toán này được phát hiện đồng thời và độc lập bởi những người riêng biệt là một dấu hiệu cho thấy nó rõ ràng ở một mức độ nào đó. Cho dù một cái gì đó là "rõ ràng" là một chức năng của các ràng buộc dự án và môi trường lập trình rộng hơn. Nếu bạn cần (1) tìm kiếm văn bản nhanh và (2) bạn nhận thức được tầm quan trọng của thuật toán O (n) thực sự và (3) bạn đã gặp văn bản có khớp một phần trước đó và (4) bạn có thời gian để làm những việc "đúng", thì thuật toán này có lẽ là hiển nhiên.
Matt Gallagher

Trong một cuộc phỏng vấn, Knuth nói rằng ý tưởng về thuật toán xuất phát từ việc nghiên cứu máy tự động hữu hạn hai chiều của Stephen Cook cho các palindromes.
Kaveh

@Kaveh Vui lòng đọc Phần 7 (Nhận xét lịch sử) từ giấy KMP gốc. Nó có những nhận xét tuyệt vời. Về việc Morris viết một trình soạn thảo văn bản "quá phức tạp để những người thực hiện hệ thống khác hiểu". Về Knuth "lần đầu tiên trong kinh nghiệm của Knuth rằng lý thuyết automata đã dạy anh ta cách giải quyết vấn đề lập trình thực sự tốt hơn anh ta có thể giải quyết nó trước đây". Và "Knuth đã rất bối rối khi biết rằng Morris đã phát hiện ra thuật toán, mà không biết định lý của Cook;". VUI VẺ.
Hendrik

93

Thuật toán của Blum, Floyd, Pratt, Rivest và Tarjan để tìm phần tử thứ k của danh sách chưa sắp xếp theo thời gian tuyến tính là một thuật toán đẹp và chỉ hoạt động vì các số vừa phải phù hợp với Định lý chính. Nó diễn ra như sau:

  1. Sắp xếp từng chuỗi năm yếu tố.
  2. Chọn ra trung vị trong mỗi.
  3. Recur để tìm trung vị của danh sách này.
  4. Xoay trên trung vị của trung vị (như trong Quicksort)
  5. Chọn bên thích hợp của danh sách và vị trí trong danh sách đó và tái diễn.

3
Đây là một trong những thuật toán yêu thích của tôi. Tôi thích một trực giác cho nó mà tôi đã học được từ cuốn sách khác biệt của Chazelle: tập hợp các trung vị của các nhóm phần tử giống như một -net trong các danh sách theo thứ tự các số đầu vào. Vì vậy, thuật toán tuân theo một mô hình chung: tính toán -net nhanh, giải quyết vấn đề trên mạng, lặp lại một số phần của đầu vào để tinh chỉnh giải pháp, cho đến khi bạn có giải pháp chính xác. đó là kỹ thuật rất hữu íchε ε1/ϵϵϵ
Sasho Nikolov

5
BTW một khi bạn tham số kích thước của các nhóm, các hằng số không quá kỳ diệu. tất nhiên chúng được tối ưu hóa để đưa ra điều đúng trong định lý Master
Sasho Nikolov

Việc triển khai Ruby, gist.github.com/chadbrewbaker/7202412 Có phiên bản thuật toán nào sử dụng không gian (không đổi, nhật ký) hay bạn phải sử dụng không gian đầu tuyến tính để giữ trung vị?
Chad Brewbaker 23/11/13

2
Khẳng định rằng "điều này chỉ hoạt động vì các con số vừa phải để phù hợp với định lý chính" là không thực sự đúng. Nếu bạn thay số bằng số lớn hơn , có thể dễ dàng thấy rằng hai số phải tổng nhỏ hơn hội tụ thành và , vì vậy tất cả đủ lớn đều hoạt động. chỉ là số đầu tiên hoạt động, nó không phải là số duy nhất. n 1 3 / 4 0 n 55n13/40n5
Will Sawin

88

Tìm kiếm nhị phân là thuật toán đơn giản, đẹp và hữu ích nhất mà tôi từng sử dụng.


Tôi sẽ thay thế thanh lịch bằng trực quan. Không có gì thanh lịch về nó; sự đơn giản của nó là vẻ đẹp thực sự của nó.
Robert Massaioli

@Robert Massaili: Tôi thay thế thanh lịch bằng xinh đẹp. Bạn đã đúng về điều đó.
michalmocny


Trong khóa học thuật toán tốt nghiệp đầu tiên của tôi, chúng tôi đã có 15 câu đố trong đó chúng tôi phải giải quyết 2-3 vấn đề bằng tay. Bài kiểm tra đầu tiên như vậy bao gồm một cây tìm kiếm nhị phân và hai câu hỏi về đống. Tôi đã bối rối và mất tinh thần khi biết rằng tôi đã hiểu sai vấn đề tìm kiếm nhị phân, trước khi được thông báo rằng trong một lớp học khoảng 30 người có hai câu trả lời đúng. Nhưng ngay cả khi biết điều đó, thực tế là phải mất 15 năm để cộng đồng chuyên nghiệp có được quyền là đáng kinh ngạc.
Stella Biderman

84

Tôi ngạc nhiên khi không thấy thuật toán Floyd-Warshall cho các đường dẫn ngắn nhất của tất cả các cặp ở đây:

d[]: 2D array. d[i,j] is the cost of edge ij, or inf if there is no such edge.

for k from 1 to n:
  for i from 1 to n:
    for j from 1 to n:
      d[i,j] = min(d[i,j], d[i,k] + d[k,j])

Một trong những thuật toán ngắn nhất, không tầm thường nhất sẽ xuất hiện và hiệu suất rất linh hoạt khi bạn cho rằng có thể có các cạnh . Đó sẽ là con poster của tôi cho lập trình năng động!O ( n 2 )O(n3)O(n2)


2
Thuật toán này cũng có thể được khái quát một cách thực sự gọn gàng. Xem ví dụ: r6.ca/blog/20110808T035622Z.htmlcl.cam.ac.uk/~sd601/ con / emirings.pdf
Mikhail Glushenkov


73

Có thể có vẻ hơi tầm thường (đặc biệt là so với các câu trả lời khác), nhưng tôi nghĩ rằng Quicksort thực sự thanh lịch. Tôi nhớ rằng khi tôi lần đầu tiên nhìn thấy nó, tôi đã nghĩ nó thực sự phức tạp, nhưng bây giờ mọi thứ dường như quá đơn giản.


10
Quicksort cũng đặt ra những câu hỏi thú vị về chính xác bản chất của thuật toán là gì. Ví dụ, việc triển khai Haskell thanh lịch tiêu chuẩn trông giống hệt như định nghĩa mã giả tiêu chuẩn, nhưng nó có độ phức tạp tiệm cận khác nhau. Vì vậy, Quicksort chỉ là về phân chia và chinh phục hay là con trỏ in-situ thông minh đang thay đổi một phần thiết yếu của Quicksort? Quicksort thậm chí có thể được thực hiện trong một thiết lập chức năng thuần túy hay nó đòi hỏi khả năng biến đổi?
Jörg W Mittag

2
Ý tưởng về "bản chất" hay "đạo đức" của một thuật toán tất nhiên xuất phát từ bài báo tuyệt đẹp Sàng chính xác của Melat E. O'Neill ( cs.hmc.edu/~oneill/ con / Sieve-JFP. pdf ) và cuộc thảo luận về quicksort xuất phát từ cuộc thảo luận LtU của bài báo đó ( lambda-the-ultimate.org/node/3127 ), đặc biệt bắt đầu từ nhận xét này: lambda-the-ultimate.org/node/3127/#comment-45549
Jörg W Mittag

8
@ Jörg: Việc triển khai quicksort trên các danh sách được liên kết là hoàn toàn hợp lý và có cùng thời gian chạy không có triệu chứng giống như việc triển khai tại chỗ trên các mảng (quái, thậm chí việc triển khai ngoài địa điểm ngây thơ trên các mảng có cùng thời gian chạy) trung bình và trong trường hợp xấu nhất Đối với việc sử dụng không gian, điều này thực sự khác biệt nhưng phải nói rằng ngay cả phiên bản tại chỗ của Cameron yêu cầu không gian thêm không đổi (ngăn xếp cuộc gọi!), Một thực tế dễ bị bỏ qua.
Konrad Rudolph

Ngoài ra, cũng đáng để đề cập đến Quicksort Dual-Pivot Quicksort của Vladimir Yaroslavskiy. Đó phải là nhanh hơn 20% nhanh chóng ban đầu permalink.gmane.org/gmane.comp.java.openjdk.core-libs.devel/ Lỗi
SaveTheRbtz

Về lý thuyết, Quicksort rất đơn giản (có thể được phác thảo trong 4 bước) và có thể được tối ưu hóa cao, nhưng trong thực tế, rất khó để viết mã chính xác. Đó là lý do tại sao nó không nhận được phiếu bầu của tôi.
Dennis


50

Bài kiểm tra tính nguyên thủy Miller-Rabin (và các bài kiểm tra tương tự) nên có trong Sách. Ý tưởng là tận dụng các tính chất của các số nguyên tố (nghĩa là sử dụng định lý nhỏ của Fermat) để tìm kiếm một nhân chứng cho số không phải là số nguyên tố. Nếu không có nhân chứng được tìm thấy sau khi kiểm tra ngẫu nhiên đủ, số được phân loại là số nguyên tố.

Trên lưu ý đó, bài kiểm tra nguyên thủy của AKS cho thấy PRIMES có trong P chắc chắn phải có trong Sách!


49

Kiểm tra nhận dạng đa thức với bổ đề Schwartz-Zippel :

Nếu ai đó đánh thức bạn vào giữa đêm và yêu cầu bạn kiểm tra hai biểu thức đa thức đơn biến để nhận dạng, có lẽ bạn sẽ giảm chúng thành dạng tổng hợp của sản phẩm và so sánh để nhận dạng cấu trúc. Thật không may, việc giảm có thể mất thời gian theo cấp số nhân; nó tương tự như việc giảm các biểu thức Boolean thành dạng bình thường khác biệt.

Giả sử bạn là loại người thích các thuật toán ngẫu nhiên, nỗ lực tiếp theo của bạn có thể là đánh giá các đa thức tại các điểm được chọn ngẫu nhiên để tìm kiếm các phản mẫu, tuyên bố các đa thức rất giống nhau nếu chúng vượt qua đủ các bài kiểm tra. Bổ đề Schwartz-Zippel cho thấy khi số lượng điểm tăng lên, cơ hội dương tính giả sẽ giảm đi rất nhanh.

Không có thuật toán xác định cho vấn đề được biết là chạy trong thời gian đa thức.


Điều này nên được đề xuất từ ​​lâu! Cảm ơn!
arnab

1
Có một số thuật toán ngẫu nhiên khác xứng đáng có một vị trí nổi bật trong Sách. Đối với những điều này, sự tương phản giữa các lựa chọn xác định và xác suất là ít ấn tượng hơn: một thuật toán xác định thường tồn tại nhưng phức tạp hơn nhiều.
Per Vognsen

Tôi đã độc lập phát minh ra thuật toán tương tự trong khi tôi đang làm việc trên một tờ giấy vài năm trước cho đến khi ai đó hỏi tôi không phải là bổ đề Schwartz-Zippel? Và tôi đã nói, đó là gì? :)
Helium

46

Độ sâu tìm kiếm đầu tiên . Nó là cơ sở của nhiều thuật toán khác. Nó cũng đơn giản một cách lừa dối : Ví dụ: nếu bạn thay thế hàng đợi trong triển khai BFS bằng ngăn xếp, bạn có nhận được DFS không?


1
Nó cũng là cơ sở của việc thực hiện Prolog!
muad

1
Điểm BFS với ngăn xếp tôi đang thiếu là gì? Tôi đã có thể nghĩ rằng câu trả lời là "có, bạn nhận được DFS".
Omar Antolín-Camarena

1
Chà, mọi người dường như nghĩ vấn đề này là tầm thường. Ngoài ra, mọi người dường như nghĩ câu trả lời là "có", đó là sai. Câu trả lời thực sự là "phụ thuộc vào việc bạn bắt đầu thực hiện BFS nào". Xem cs.stackexchange.com/questions/329/ (Đây là câu hỏi tôi đã đăng để trợ giúp với giai đoạn beta của CS.SE)
Radu GRIGore

Nó cũng được thảo luận ngắn gọn ở đây: ics.uci.edu//~eppstein/161/960215.html
Radu GRIGore

42

Thuật toán của Dijkstra : bài toán đường dẫn ngắn nhất nguồn đơn cho một biểu đồ với chi phí đường dẫn cạnh không âm. Nó được sử dụng ở mọi nơi và là một trong những thuật toán đẹp nhất hiện có. Internet không thể được định tuyến mà không có nó - nó là một phần cốt lõi của các giao thức định tuyến IS-IS và OSPF (Mở đường dẫn ngắn nhất trước tiên).

  1. Gán cho mỗi nút một giá trị khoảng cách. Đặt nó thành 0 cho nút ban đầu của chúng tôi và vô cùng cho tất cả các nút khác.
  2. Đánh dấu tất cả các nút là không mong muốn. Đặt nút ban đầu là hiện tại.
  3. Đối với nút hiện tại, hãy xem xét tất cả các lân cận không mong muốn của nó và tính khoảng cách dự kiến ​​của chúng (từ nút ban đầu). Ví dụ: nếu nút hiện tại (A) có khoảng cách là 6 và một cạnh kết nối nó với nút khác (B) là 2, khoảng cách đến B qua A sẽ là 6 + 2 = 8. Nếu khoảng cách này nhỏ hơn khoảng cách được ghi trước đó (vô cực ở đầu, 0 cho nút ban đầu), ghi đè khoảng cách.
  4. Khi chúng ta hoàn thành việc xem xét tất cả các lân cận của nút hiện tại, đánh dấu nó là đã truy cập. Một nút truy cập sẽ không được kiểm tra nữa; khoảng cách của nó được ghi lại bây giờ là cuối cùng và tối thiểu.
  5. Nếu tất cả các nút đã được truy cập, kết thúc. Mặt khác, đặt nút không mong muốn với khoảng cách nhỏ nhất (từ nút ban đầu) làm "nút hiện tại" tiếp theo và tiếp tục từ bước 3.


40

Lược đồ mã hóa hoàn toàn tương đồng của Gentry (trên các mạng lý tưởng hoặc trên các số nguyên) rất đẹp. Nó cho phép bên thứ ba thực hiện các tính toán tùy ý trên dữ liệu được mã hóa mà không cần truy cập vào khóa riêng.

Đề án mã hóa là do một số quan sát quan tâm.

  • Để có được một sơ đồ mã hóa đồng cấu hoàn toàn, người ta chỉ cần có một sơ đồ tương đồng với phép cộng và phép nhân. Điều này là do phép cộng và phép nhân (mod 2) là đủ để có các cổng AND, OR và KHÔNG (và do đó Turing Completeness).
  • Rằng nếu có một sơ đồ như vậy, nhưng do một số hạn chế chỉ có thể được thực thi đối với các mạch có độ sâu hữu hạn, thì người ta có thể đánh giá một cách đồng hình quy trình giải mã và tái hấp thu để thiết lập lại giới hạn độ sâu của mạch mà không làm mất tính riêng tư của khóa.
  • Điều đó bằng cách "nén" độ sâu của phiên bản mạch của chức năng giải mã cho sơ đồ, người ta có thể cho phép một sơ đồ ban đầu giới hạn ở các mạch nông, hữu hạn một số lượng tính toán tùy ý.

Trong luận án của mình, Craig Gentry đã giải quyết một vấn đề mở lâu dài (và tuyệt đẹp) trong ngành mật mã. Thực tế là một sơ đồ đồng hình hoàn toàn tồn tại đòi hỏi chúng ta nhận ra rằng có một số cấu trúc vốn có cho khả năng tính toán mà chúng ta có thể đã bỏ qua.

http://crypto.stanford.edu/craig/craig-thesis.pdf

http://eprint.iacr.org/2009/616.pdf

http://portal.acm.org/cites.cfm?id=1666420.1666445



38

Thuật toán của Strassen cho phép nhân ma trận.


Có lẽ sẽ đợi cho đến khi chúng tôi biết nếu nó là tối ưu.
Thomas Ahle

Ít nhất, nó không tối ưu, không có triệu chứng ... Tôi nghĩ rằng bao gồm cả thuật toán của Strassen buộc bạn phải đưa thuật toán của Karatsuba vào trước.
Timothy Sun


34

Thuật toán thời gian tuyến tính để xây dựng các mảng hậu tố thực sự rất đẹp, mặc dù nó không thực sự nhận được sự công nhận mà nó xứng đáng http://www.cs.helsinki.fi/u/tpkarkka/publications/icalp03.pdf


Tôi làm nghĩ rằng nó đã nhận được sự công nhận nó xứng đáng - những gì làm cho bạn nghĩ khác? Ví dụ, nó được triển khai trong thư viện phân tích trình tự C ++ SeqAn.
Konrad Rudolph

Điều đáng nói là hiện nay có một số thuật toán xây dựng mảng hậu tố thời gian tuyến tính và phi tuyến tính khác, mặc dù không có gì đẹp, có thể nhanh hơn rất nhiều trong thực tế. "Một cách tiếp cận hiệu quả, linh hoạt để sắp xếp hậu tố", Tạp chí Thuật toán Thực nghiệm (JEA), Tập 12, tháng 6 năm 2008 có một số kết quả thử nghiệm dọc theo các dòng này.
Raphael

@Raphael: Tôi có một chút cảnh giác với thực tế là trên p. 3 bài báo JEA đó, họ chỉ đưa ra những gì họ "tin" là ràng buộc "lỏng lẻo" của O (n ^ 2 log n) ... Bạn có biết bất kỳ bài báo nào có thuật toán thời gian tuyến tính nhanh hơn thực tế so với Thuật toán xiên?
dùng651

32

Phép loại trừ Gaussian. Nó hoàn thành trình tự khái quát hóa từ thuật toán GCD của Euclid đến Knuth-Bendix.


BTW, trình tự khái quát hóa là gì, và thuật toán của Hội trưởng cho cơ sở Grobner phù hợp với nó ở đâu? (Nó có vẻ tương tự như Knuth-Bendix, nhưng tôi đã thấy một đề cập ở đâu đó rằng nó khái quát hóa việc loại bỏ Gaussian)
ShreevatsaR

6
trình tự là: Euclide GCD -> Loại bỏ Gaussian -> Buchberger -> Knuth-Bendix. Người ta cũng có thể đưa vào (thay vì loại bỏ Gaussian) phân chia đa thức và modulo đơn biến (theo thứ tự khái quát hóa là 'tách biệt' với Gaussian Elimination, GE là đa biến bậc 1, vòng đa thức là không giới hạn mức độ không giới hạn. bước nhảy tổng quát hóa lớn nhất từ ​​EGCD ​​sang GE hoặc vòng đa thức vì có thêm các biến, và sau đó cũng lớn từ Buchberger sang KB vì chữ ký không giới hạn.
Mitch

+1: Thuật toán Euclide giải phương trình nổi tiếng nhất ax-by = 1 trong toán học. Tại sao nó không xuất hiện trong CS thường xuyên hơn là một bí ẩn.
Tegiri Nenashi

32

Tôi đã rất ấn tượng khi lần đầu tiên nhìn thấy thuật toán lấy mẫu hồ chứa và bằng chứng của nó. Đây là câu đố kiểu "trêu ghẹo não" điển hình với một giải pháp cực kỳ đơn giản. Tôi nghĩ rằng nó chắc chắn thuộc về cuốn sách, cả về thuật toán cũng như các định lý toán học.

Về cuốn sách, câu chuyện kể rằng khi Erdös chết và lên thiên đàng, anh ta yêu cầu được gặp Chúa. Yêu cầu đã được cấp và cho cuộc họp Erdös chỉ có một câu hỏi. "Tôi có thể tìm trong sách không?" Chúa nói đồng ý và dẫn Erdös đến đó. Tự nhiên rất phấn khích, Erdös mở cuốn sách chỉ để xem những điều sau đây.

Định lý 1: ...
Chứng minh: Rõ ràng.

Định lý 2: ...
Chứng minh: Rõ ràng.

Định lý 3: ...
Chứng minh: Rõ ràng.


4
Định lý 4: Bằng chứng: tập thể dục cho người đọc.
jon

31

Các Rùa và thỏ Algorithm . Tôi thích nó bởi vì tôi chắc chắn rằng ngay cả khi tôi đã lãng phí cả cuộc đời để cố gắng tìm ra nó, không có cách nào tôi có thể nghĩ ra một ý tưởng như vậy.


6
Bạn có biết thuật toán câm giải quyết vấn đề với cùng một tiệm cận và theo một mẫu thiết kế thuật toán không? Tôi đang nói về việc lặp đi lặp lại sâu sắc. Trong lần lặp thứ n, bạn bắt đầu từ người kế vị 2 ^ n-root và tìm kiếm 2 ^ n người kế tiếp để tìm kiếm sự tái phát. Mặc dù bạn đang truy xuất một số bước của mình với mỗi lần lặp, tốc độ tăng trưởng hình học của bán kính tìm kiếm có nghĩa là nó không ảnh hưởng đến sự không triệu chứng.
Per Vognsen

30

Một ví dụ cơ bản và "tầm thường" như bằng chứng của Euclid về vô số số nguyên tố:

Xấp xỉ 2 cho MAX-CUT - Độc lập cho mỗi đỉnh, gán nó cho một trong hai phân vùng có xác suất bằng nhau.


6
Vâng, một thuật toán rất hay. Ít quan trọng hơn, với chi phí của một yếu tố khác là 2, thuật toán này cũng hoạt động để tối đa hóa bất kỳ hàm mô đun con nào , không chỉ là hàm cắt đồ thị. Đây là kết quả của Feige, Mirrokni và Vondrak từ FOCS 07
Aaron Roth

30

Tôi đã luôn luôn là một phần của Thuật toán của Christofides mang lại sự gần đúng (3/2) cho TSP số liệu. Trong thực tế, gọi cho tôi dễ dàng để làm hài lòng, nhưng tôi thậm chí thích thuật toán xấp xỉ 2 xuất hiện trước nó . Thủ thuật của Christofides trong việc tạo ra một cây Eulerian có trọng lượng tối thiểu bằng cách thêm khớp với các đỉnh bậc lẻ của nó (thay vì sao chép tất cả các cạnh) là đơn giản và thanh lịch, và chỉ cần thuyết phục một chút rằng khớp này có không quá một nửa trọng lượng của một tour du lịch tối ưu.


Thật vậy, cũng có rất nhiều thuật toán xấp xỉ đơn giản và thanh lịch khác với các đảm bảo xấp xỉ khá.
Janne H. Korhonen



25

Các thuật toán cho lập trình tuyến tính : Simplex, Ellipsoid và các phương thức điểm bên trong.

http://en.wikipedia.org/wiki/Linear_programming#Alacticms


Và thực tế, một số giải thưởng Nobel đã được trao cho việc thúc đẩy sự hiểu biết của chúng ta về những vấn đề này.
Ross Snider

@Ross Kantorovich đã giành giải thưởng Nobel về kinh tế vì đã phát minh ra LP và áp dụng nó vào phân bổ nguồn lực. Những giải thưởng khác bạn đã nghĩ đến?
Đánh dấu Reitblatt

@Mark Koopermans đã được trao giải thưởng cao quý với Kantorovich, nhưng tôi vẫn không chính xác khi nói "nhiều".
Ross Snider

22

Thuật toán Robin Moser để giải một lớp cá thể SAT nhất định. Những trường hợp như vậy có thể giải quyết được bởi Bổ đề địa phương Lovasz. Thuật toán Moser thực sự là một sự khử ngẫu nhiên của tuyên bố của bổ đề.

Tôi nghĩ rằng một số năm, thuật toán của anh ấy (và kỹ thuật chứng minh tính chính xác của nó) sẽ được tiêu hóa tốt và tinh chỉnh đến mức trở thành một ứng cử viên khả thi cho Thuật toán từ Sách .

Phiên bản này là một phần mở rộng của bài báo gốc của ông, được viết bằng Gábor Tardos.


21

Thuật toán nhanh nhất và ngắn nhất của Marcus Hutter cho tất cả các vấn đề được xác định rõ .

Loại này đi ngược lại với tinh thần của các dịch vụ khác trong danh sách này, vì nó chỉ mang tính lý thuyết và không quan tâm thực tế, nhưng sau đó một lần nữa loại tiêu đề nói lên tất cả. Có lẽ nó nên được đưa vào như một câu chuyện cảnh báo cho những người chỉ nhìn vào hành vi tiệm cận của một thuật toán.


21

Thuật toán X của Knuth tìm thấy tất cả các giải pháp cho vấn đề chính xác . Điều kỳ diệu về nó là kỹ thuật mà ông đề xuất để thực hiện nó một cách hiệu quả: Dancing Links .


20

Tôi nghĩ rằng chúng ta phải bao gồm Schieber-Vishkin , trả lời các truy vấn tổ tiên chung thấp nhất trong thời gian không đổi, tiền xử lý rừng theo thời gian tuyến tính.

Tôi thích phần trình bày của Knuth trong Tập 4 Fascicle 1, và sự trầm ngâm của anh ấy . Anh ấy nói anh ấy mất hai ngày để hiểu đầy đủ về nó, và tôi nhớ những lời anh ấy nói:

Tôi nghĩ nó khá đẹp, nhưng đáng kinh ngạc là nó đã bị báo chí xấu trong văn học (..) Nó dựa trên toán học làm tôi phấn khích.


10
Đợi đã, nó có thể rất đẹp, nhưng nếu phải mất hai ngày để Knuth hiểu đầy đủ về nó, nó có thực sự "từ cuốn sách" không?
ShreevatsaR

@ShreevatsaR Cuốn sách có in đẹp ở phần chú thích :)
hsmyer
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.