Алгоритми з книги.


358

Пол Ердос розповів про "Книгу", де Бог зберігає найелегантніші докази кожної математичної теореми. Це навіть надихнуло книгу (яка, на мою думку, зараз є у її четвертому виданні): Докази з книги .

Якби Бог мав аналогічну книгу щодо алгоритмів, який алгоритм, на вашу думку, був би кандидатом?

Якщо можливо, будь ласка, надайте посилання, що можна натискати, та ключові відомості, які дозволять йому працювати.

Будь ласка, лише один алгоритм на відповідь.


11
Чудове запитання! [Редагувати:} Одне запитання. Де ми проведемо межу між алгоритмами та структурами даних? Що робити, якщо ключове розуміння алгоритму тісно пов'язане з структурою даних (наприклад, UNION FIND у зворотній функції Ackermann)?
Росс Снайдер

4
чудовим джерелом і, можливо, кандидатом на таку книгу є "Енциклопедія алгоритмів" springer.com/computer/theoretical+computer+science/book/…
Marcos Villagra

21
Я трохи здивований, що алгоритми, які я вважаю досить складними (KMP, лінійні масиви суфіксів), інші вважають "з книги". Для мене "з Книги" означає просте і очевидне, але тільки з заднім поглядом. Мені цікаво, як інші трактують "елегантно".
Раду ГРИГо

49
@supercooldave Вам не потрібно вірити в Бога, але ви повинні вірити в його книгу. ;-)
Росс Снайдер

10
Під час лекції в 1985 році Ерд сказав: "Вам не потрібно вірити в Бога, але ви повинні вірити в Книгу".
Роберт Массайолі

Відповіді:


116

Пошук союзу - прекрасна проблема, найкращий алгоритм / структура даних ( Disjoint Set Forest ) заснована на степі спагетті. Хоча це дуже просто та інтуїтивно зрозуміло, щоб пояснити розумній дитині, знадобилося кілька років, щоб чітко обмежити час її виконання. Зрештою, було виявлено, що його поведінка пов'язана із зворотною функцією Акермана, функцією, відкриття якої ознаменувало зміну точки зору щодо обчислення (і насправді було включено у «Гірбертське« Нескінченне ).

У Вікіпедії є хороший вступ до нерозчленованих лісів .


109

Збіг рядків Knuth-Morris-Pratt Вісім рядків коду, які ви коли-небудь побачите.


4
Своїм розумом нудно усвідомити, що це було щось не очевидне в певний час і очевидно лише зараз, тому що вони придумали це, і ми це дізналися ... Я думаю, що ми повинні застосувати теорію історії Карра до математики та інформатики .
Ritwik Bose

1
За описом, я б сказав, що це пов'язано з швидким пошуком підрядків Бойєра-Мура.
барт

2
@Mechko Той факт, що цей алгоритм був відкритий одночасно та незалежно окремими людьми, є свідченням того, що це очевидно до певної міри. Чи є щось "очевидним" - це функція обмежень проекту та більш широкого середовища програмування. Якщо вам потрібен (1) швидкий пошук тексту та (2) ви усвідомлюєте важливість справді O (n) алгоритмів, і (3) ви стикалися з текстом з частковими збігами раніше, і (4) у вас є час щоб робити речі "правильно", тоді цей алгоритм, мабуть, очевидний.
Метт Галлахер

В інтерв'ю Кнут сказав, що ідея алгоритму виникла з вивчення двостороннього кінцевого автомата Стівена Кука для паліндромів.
Каве

@Kaveh Прочитайте розділ 7 (Історичні зауваження) з оригіналу документа KMP. Це чудові зауваження. Про Морріс пише текстовий редактор, який "був занадто складним, щоб його зрозуміли інші виконавці системи". Про Кнут "вперше в досвіді Кнута теорія автоматів навчила його вирішувати реальну проблему програмування краще, ніж він міг її вирішити раніше". І "Кнут був прихилений, дізнавшись, що Морріс вже відкрив алгоритм, не знаючи теореми Кука;". ЗАБАВИТИ.
Хендрік Січ

93

Алгоритм Блюма, Флойд, Пратт, Ривест і Tarjan , щоб знайти K - й елемент несортоване списку в лінійний час красивий алгоритм, і працює тільки тому , що номер тільки право , щоб відповідати в Генеральній теоремі. Виходить так:

  1. Сортуйте кожну послідовність із п’яти елементів.
  2. Виберіть медіану в кожній.
  3. Повторіть пошук медіани цього списку.
  4. Поворот на медіані медіани (як у Quicksort)
  5. Виберіть потрібну сторону списку та розташуйте у цьому списку та повторіть повтор.

3
Це один з моїх улюблених алгоритмів. Мені подобається інтуїція цього, що я дізнався з книги розбіжностей Шазел: набір медіанів груп елементів - це як -net для інтервалів в упорядкованому списку вхідних чисел. Тож алгоритм дотримується загальної парадигми: обчисліть -net швидко, вирішіть проблему в мережі, повторіть деяку частину входу для вдосконалення рішення, поки не знайдете точне рішення. це дуже корисна технікаϵ ϵ1/ϵϵϵ
Сашо Ніколов

5
Доречі, коли ви параметризуєте розмір груп, константи не такі магічні. вони, звичайно, оптимізовані, щоб дати правильну річ в теоремі Майстра
Сашо Ніколов

Реалізація Ruby, gist.github.com/chadbrewbaker/7202412 Чи є версія алгоритму, що використовує (постійний, журнальний) простір, чи вам потрібно використовувати лінійний простір подряпин, щоб утримувати медіани?
Чад Brewbaker

2
Твердження, що "це працює лише тому, що числа є справедливими, щоб вписатись у головну теорему", насправді не відповідає дійсності. Якщо замінити число більшим числом , то легко помітити, що два числа, які мають дорівнювати менше сходяться до та , тому всі досить великі працюють. - це лише перше число, яке працює, це не єдине. н 1 3 / 4 0 п 55n13/40n5
Вілл Савін

88

Двійковий пошук - це найпростіший, красивий і корисний алгоритм, з яким я коли-небудь стикався.


Я б замінив елегантне на інтуїтивне. У цьому немає нічого елегантного; простота його - справжня краса.
Роберт Массайолі

@Robert Massaili: Я замінив елегантне на красиве. Ви мали рацію з цього приводу.
michalmocny


У моєму першому курсі з алгоритмів для випускників у нас було 15 хвилин вікторини, де нам довелося вирішити 2-3 проблеми вручну. Перша така вікторина включала двійкове дерево пошуку та два питання про купи. Мене збентежило і злякалося дізнатись, що я неправильно зрозумів проблему бінарного пошуку, перш ніж мені сказали, що в класі з 30 людей було два правильних відповіді. Але навіть знаючи це, той факт, що професійному співтовариству знадобилося 15 років, приголомшливо вражає.
Стелла Бідерман

84

Я здивований, що не бачу алгоритму Флойда-Варшалла для всіх пар найкоротших шляхів тут:

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])

Один з найкоротших, найясніших нетривіальних алгоритмів, і виконання дуже сприятливе, якщо врахувати, що може бути ребер. Це було б моїм плакатом для динамічного програмування!O ( n 2 )O(n3)O(n2)


2
Цей алгоритм можна також узагальнити по-справжньому охайним способом. Дивіться, наприклад, r6.ca/blog/20110808T035622Z.html та cl.cam.ac.uk/~sd601/papers/semirings.pdf
Михайло Глушенков


73

Можливо, це здасться дещо тривіальним (особливо порівняно з іншими відповідями), але я думаю, що Quicksort справді елегантний. Я пам'ятаю, що коли я вперше побачив це, я думав, що це справді складно, але зараз це здається занадто простим.


10
Quicksort також викликає цікаві питання про те, у чому саме полягає суть алгоритму. Наприклад, стандартна елегантна реалізація Haskell виглядає так само, як і стандартне визначення псевдокоду, але має різну асимптотичну складність. Отже, хіба що в Quicksort йдеться лише про поділ і перемогу, або ж розумне підмітання покажчика - це невід'ємна частина Quicksort? Чи можна навіть Quicksort реалізовувати у суто функціональній обстановці чи вона потребує змінності?
Йорг W Міттаг

2
Ідея «сутності» або «моральності» алгоритму виходить, звичайно, з прекрасного документа «Справжнє сито Ератостена» Меліси Е. О'Нілл ( cs.hmc.edu/~oneill/papers/Sieve-JFP). pdf ), а обговорення на швидкості відбувається з обговорення цього документу LtU ( lambda-the-ultimate.org/node/3127 ), зокрема починаючи з цього коментаря: lambda-the-ultimate.org/node/3127/#comment-45549
Йорг W Міттаг

8
@ Jörg: Реалізація квакіспорту у зв'язаних списках є цілком розумною і має такий самий асимптотичний час роботи, що і її реалізація на масивах (чорт, навіть наївна реалізація на місці масивів має однаковий час роботи) - і на середній і в гіршому випадку. Що стосується використання місця, то це дійсно інакше, але треба сказати, що навіть "на місці" версія вимагає непостійного додаткового простору (стек викликів!), Факт, який легко помітити.
Конрад Рудольф

Також варто згадати про подвійний прутний кікспорт Володимира Ярославського. Це повинно бути принаймні на 20% швидшим оригінальним quicksort permalink.gmane.org/gmane.comp.java.openjdk.core-libs.devel/…
SaveTheRbtz

Quicksort в теорії простий (можна окреслити в 4 етапи) і може бути оптимізований, але на практиці це дуже складно правильно кодувати. Ось чому він не отримує мого голосу.
Денніс


50

Тест на простоту Міллера-Рабіна (і подібні тести) повинні бути в книзі. Ідея полягає в тому, щоб скористатися властивостями праймес (тобто, використовуючи маленьку теорему Ферма), щоб імовірнісно шукати свідка того, що число не є простим. Якщо свідків не знайдено після достатньо випадкових тестів, число класифікується як основне.

З цього приводу, тест первинності AKS, який показав PRIMES, є в P, безумовно, повинен бути в Книзі!


49

Тестування поліноміальної ідентичності за лемою Шварца-Зіппеля :

Якщо хтось розбудив вас посеред ночі і попросив випробувати два одновимірні поліномічні вирази на ідентичність, ви, мабуть, зведете їх до нормальної форми суми продуктів і порівняйте за структурною ідентичністю. На жаль, скорочення може зайняти експоненціальний час; це аналогічно зведенню булевих виразів до диз'юнктивної нормальної форми.

Якщо припустити, що ви любите рандомізовані алгоритми, наступною вашою спробою, ймовірно, буде оцінка поліномів у випадково вибраних точках у пошуках зустрічних прикладів, оголосивши поліноми, ймовірно, ідентичними, якщо вони пройдуть достатню кількість тестів. Лема Шварца-Зіппеля показує, що зі збільшенням кількості очок шанс помилкового позитиву зменшується дуже швидко.

Не відомий детермінований алгоритм задачі, який працює в поліноміальний час.


Це треба було давно запропонувати! Дякую!
arnab

1
Існує кілька інших рандомізованих алгоритмів, які заслуговують на чільне місце у Книзі. Для цього контраст між детермінованою та ймовірнісною альтернативою менш вражаючий: детермінований алгоритм, як правило, існує, але значно складніший.
Per Vognsen

Я самостійно винайшов той самий алгоритм, коли пару років тому працював над папером, поки хтось не запитав мене, чи не лемма Шварца-Зіппеля? І я сказав, що це? :)
Гелій

46

Глибинний перший пошук . Це основа багатьох інших алгоритмів. Це також оманливо просто: Наприклад, якщо ви замінюєте чергу в реалізації BFS стеком, ви отримуєте DFS?


1
Це також основа виконання Prolog!
муад

1
Який сенс у BFS із стеком, якого я не вистачає? Я б подумав, що відповідь "так, ви отримуєте ДФС".
Омар Антолін-Камарена

1
Що ж, всі здаються, що ця проблема є тривіальною. Крім того, всі, здається, вважають, що відповідь "так", що є неправильним. Відповідь насправді "залежить від того, з якої реалізації BFS ви почнете". Дивіться cs.stackexchange.com/questions/329/… (це питання я розмістив, щоб допомогти з бета-фазою CS.SE)
Раду ГРИГо

Тут також коротко обговорюється тут: ics.uci.edu//~eppstein/161/960215.html
Radu GRIGо

42

Алгоритм Дійкстри : проблема найменшого короткого шляху для одного графіка для графіка з негативними крайовими витратами шляху. Він використовується скрізь і є одним з найкрасивіших алгоритмів. Без нього не можна було прокласти Інтернет - це основна частина протоколів маршрутизації IS-IS та OSPF (Open Shortest Path First).

  1. Призначте кожному вузлу значення відстані. Встановіть його на нуль для нашого початкового вузла та на нескінченність для всіх інших вузлів.
  2. Позначте всі вузли як невидимі. Встановіть початковий вузол як поточний.
  3. Для поточного вузла розгляньте всі його невідомі сусіди та обчисліть їх орієнтовну відстань (від початкового вузла). Наприклад, якщо поточний вузол (A) має відстань 6, а ребро, що з'єднує його з іншим вузлом (B), дорівнює 2, відстань від B до A буде 6 + 2 = 8. Якщо ця відстань менше попередньо записаної відстані (нескінченність на початку, нуль для початкового вузла), перепишіть відстань.
  4. Коли ми закінчимо розглядати всіх сусідів поточного вузла, позначте його як відвідуваний. Відвіданий вузол більше ніколи не перевірятиметься; його відстань, записана зараз, остаточна і мінімальна.
  5. Якщо всі вузли були відвідані, закінчіть. В іншому випадку встановіть невідомий вузол з найменшою відстані (від початкового вузла) як наступний "поточний вузол" і продовжуйте з кроку 3.


40

Повністю гомоморфна схема шифрування Джентрі (або над ідеальними гратами, або над цілими числами) надзвичайно гарна. Це дозволяє третій стороні виконувати довільні обчислення на зашифрованих даних без доступу до приватного ключа.

Схема шифрування обумовлена ​​кількома гострими спостереженнями.

  • Щоб отримати повністю гомоморфну ​​схему шифрування, потрібно лише мати схему, гомоморфну ​​над додаванням та множенням. Це тому, що додавання та множення (мод 2) достатньо, щоб отримати ворота І, АБО та НЕ (і, отже, Turing завершеність).
  • Якщо така схема мала існувати, але через деякі обмеження можна було виконати лише для схем певної граничної глибини, то можна гомоморфно оцінити процедуру дешифрування та рецензування, щоб скинути обмеження глибини ланцюга, не приносячи шкоди ключовій конфіденційності.
  • Що, «розчавивши» глибину версії схеми функції дешифрування для схеми, можна дозволити схемі, спочатку обмеженій обмеженими, неглибокими схемами, довільною кількістю обчислень.

У своїй дисертації Крейг Джентрі вирішив давню (і чудову) відкриту проблему в криптографії. Факт існування повністю гомоморфної схеми вимагає, щоб ми визнали, що існує якась притаманна структура обчислення, яку ми могли б інакше ігнорувати.

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

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

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



38

Алгоритм Страссена для матричного множення.


Напевно, зачекаємо, поки ми дізнаємось, чи оптимально це.
Томас Ейл

Принаймні, це не оптимально, як асимптотично ... Я думаю, що включення алгоритму Страссена змушує вас в першу чергу включити алгоритм Карацуби.
Тимофій ВС

35

Алгоритм стабільного шлюбу Гейла-Шаплі . Цей алгоритм жадібний і дуже простий, спочатку не очевидно, чому він би працював, але потім доказ коректності знову легко зрозуміти.


+1, тому що в опублікованих доказів із книги про шлюби є також розділ ...
ixtmixilix

34

Лінійний алгоритм часу для створення суфіксних масивів справді прекрасний, хоча він і справді не отримав визнання, яке він заслужив http://www.cs.helsinki.fi/u/tpkarkka/publications/icalp03.pdf


Я дійсно думаю , що це вже отримав заслужене визнання - то , що змушує вас думати інакше? Наприклад, він реалізований у бібліотеці аналізу послідовностей C ++ SeqAn.
Конрад Рудольф

Варто зазначити, що існує низка інших алгоритмів побудови масиву лінійних і нелінійних суфіксів часу, які, хоча і ніде не такі гарні, на практиці можуть бути набагато швидшими. "Ефективний, універсальний підхід до сортування суфіксів", Journal of Experimental Algorithmics (JEA), Том 12, червень 2008 року, має деякі експериментальні результати.
Рафаель

@Raphael: Я трохи насторожений, що на с. 3 цієї статті JEA, вони дають лише те, що вони "вірять", це "вільне" обмеження O (n ^ 2 log n) ... Чи знаєте ви будь-які папери з алгоритмами лінійного часу , які на практиці швидші, ніж Алгоритм перекидання?
користувач651

32

Гауссова ліквідація. Він завершує послідовність узагальнення від евклідового алгоритму GCD до Knuth-Bendix.


До речі, яка послідовність узагальнення, і де алгоритм Бухбергера для основи Grobner вміщується в ньому? (Здається аналогічно Кнут-Бендікс, але я десь бачив згадку про те, що він узагальнює гаусівську ліквідацію ...)
ShreevatsaR

6
послідовність: Евклідова GCD -> Гауссова елімінація -> Buchberger -> Knuth-Bendix. Можна також ввести (замість Гауссова елімінація) універсальний поліноміальний поділ та модуль (у порядку узагальнення це «окрім» Гауссової елімінації, GE - багатоваріантний ступінь 1, поліноміальне кільце є одновимірним необмеженим ступенем, Бухбергер - багатовимірним необмеженим ступенем. стрибок узагальнення є найбільшим від EGCD ​​до GE або поліноміального кільця через додавання змінних, а потім також великий від Buchberger до KB через необмежену підпис.
Мітч

+1: Алгоритм Евкліда розв'язує найвідоміше рівняння з математики. Чому вона частіше не з’являється в CS - це загадка.
Тегірі Ненаші

32

Мене вразило, коли я вперше побачив алгоритм відбору проб пласта та його доказ. Це типова головоломка типу "тизер мозку" з надзвичайно простим рішенням. Я думаю, що це безумовно належить до книги, як для алгоритмів, так і для математичних теорем.

Що стосується книги, то йдеться про те, що коли Ердес помер і пішов на небо, він попросив зустрітися з Богом. Запит був задоволений, і для зустрічі Ердес мав лише одне питання. "Чи можу я подивитися в книзі?" Бог сказав так і привів Ердоса до цього. Зазвичай дуже схвильований, Ердес відкриває книгу лише для того, щоб побачити наступне.

Теорема 1: ...
Доведення: Очевидне.

Теорема 2: ...
Доведення: Очевидне.

Теорема 3: ...
Доказ: очевидно.


4
Теорема 4:… Доведення: вправа для читача.
jon

31

Алгоритм черепахи та зайця . Мені це подобається, тому що я впевнений, що навіть якби я все своє життя пробував, намагаючись його знайти, немає ніякого способу придумати таку ідею.


6
Чи знаєте ви німий алгоритм, який вирішує проблему з тими ж асимптотиками і дотримується алгоритмічної схеми проектування? Я говорю про ітеративне поглиблення. У n-й ітерації ви починаєте з 2 ^ n-го наступника кореня і дивитесь 2 ^ n наступників вперед у пошуках повторення. Незважаючи на те, що ви повторюєте деякі кроки з кожною ітерацією, геометрична швидкість росту радіусу пошуку означає, що це не впливає на асимптотику.
Per Vognsen

30

Приклад настільки фундаментальний і "тривіальний", як доказ Евкліда про нескінченно багато прайсів:

2-наближення для MAX-CUT - незалежно для кожної вершини призначайте її одному з двох розділів з однаковою ймовірністю.


6
Так, дуже приємний алгоритм. Менш тривіально, ціною іншого коефіцієнта 2, цей алгоритм також працює для максимізації будь-якої субмодулярної функції, а не лише функції вирізання графіка. Це результат Фейге, Міррокні та Вондрака з FOCS 07
Аарон Рот

30

Я завжди був частковим до алгоритму Кристофідеса, який дає (3/2) -апроксимацію для метричної TSP. Насправді, зателефонуйте мені легко, але мені навіть сподобався алгоритм 2-наближення, який був раніше . Хитрість Крістофідеса - створити мінімальну вагу, що охоплює дерево Ейлеріана, додавши відповідність вершин його непарного ступеня (замість того, щоб дублювати всі краї), є простим і елегантним, і потрібно мало переконати одного, що ця відповідність має не більше половини ваги оптимального туру.


Дійсно, існує також безліч інших простих і елегантних алгоритмів наближення з гідними гарантіями наближення.
Janne H. Korhonen



25

Алгоритми лінійного програмування : симплексний, еліпсоїдний та внутрішній методи точки.

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


І справді, декілька Нобелівських призів були надані за просування нашого розуміння цих проблем.
Росс Снайдер

@ Росс Канторович виграв Нобелівську премію з економіки за винахід LP та застосуванні його до розподілу ресурсів. Які ще призи ви думали?
Марк Рейтблат

@Mark Koopermans був удостоєний Нобелівської премії разом з Канторовичем, але мені все одно було неточно сказати "кілька".
Росс Снайдер

22

Алгоритм Робіна Мозера для вирішення певного класу екземплярів SAT. Такі випадки вирішуються локальною лемкою Lovasz. Алгоритм Мозера - це справді де-рандомізація твердження леми.

Я думаю, що через кілька років його алгоритм (і методика його коректності) буде добре засвоєний і вдосконалений до того, що стане життєздатним кандидатом на алгоритм із Книги .

Ця версія є продовженням його оригінального документа, написаного з Габором Тардосом.


21

Найбільш швидкий і найкоротший алгоритм Маркуса Хаттера для всіх чітко визначених проблем .

Цей вид суперечить духу інших пропозицій у цьому списку, оскільки це лише теоретичний, а не практичний інтерес, але знову ж таки титульний вид говорить про це все. Можливо, його слід включити як застережливу розповідь для тих, хто буде дивитися лише на асимптотичну поведінку алгоритму.



20

Я думаю, що ми мусимо включити Шібер-Вишкіна , який відповідає на найнижчі запити предків у постійному часі, попередньо обробляючи ліс у лінійний час.

Мені подобається експозиція Кнута в Томі 4 Fascicle 1 та його розміщення . Він сказав, що йому знадобилося цілих два дні, щоб повністю зрозуміти це, і я пам'ятаю його слова:

Я думаю, що це досить красиво, але дивно, що в літературі погана преса (..) Це засноване на математиці, яка мене хвилює.


10
Зачекайте, це може бути прекрасно, але якщо для того, щоб зрозуміти це, Кнут два цілі дні, це справді "з книги"?
ShreevatsaR

@ShreevatsaR Книга має тонкий друк у виносках :)
hsmyers
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.