Приклади складних рекурсивних алгоритмів


14

Я пояснював другові відомий детермінований алгоритм вибору лінійного часу (медіана алгоритму медіанів).

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

Я намагався знайти інші приклади таких цікавих рекурсивних алгоритмів, але не зміг знайти жодного. Всі рекурсивні алгоритми, які я міг би придумати, це або прості хвостові рекурсії, або прості поділи та підкорення (де два виклики "однакові").

Чи можете ви навести кілька прикладів складних рекурсій?


Подорож по лабіринту або загалом графік із першим шириною пошуку - простий приклад цікавої рекурсії.

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

А як із зворотним відстеженням у вирішенні головоломок та розбору? І класифікація та нерозв'язування алгоритмів також мають нестандартні рекурсії.
uli


2
@vzn: Черга не може замінити стек. BFS - особливий випадок.
Рафаель

Відповіді:


15

Моя улюблена повторюваність виявляється у чутливих до виходу алгоритмах для обчислення опуклих корпусів, спочатку Кіркпатріком та Сейделем , але пізніше повтореними іншими. Нехай позначає час обчислення опуклого корпусу з n точок у площині, коли опуклий корпус має h вершин. (Значення h невідомо заздалегідь, окрім тривіального зв'язаного h n .) Алгоритм Кіркпатріка та Зейделя дає повторення T ( n , h ) = { O ( n ), якщо T(n,h)nhhhn деn1,n23n/4іn1+n2=nіh1+h2=h

T(n,h)={O(n)if n3 or h3T(n1,h1)+T(n2,h2)+O(n)otherwise
n1,n23n/4n1+n2=nh1+h2=h .

Рішення . Це трохи дивно, оскільки h - це не розділений параметр рівномірно. Але насправді найгірший випадок рецидиву трапляється, коли h 1 і h 2 обидва про h / 2 ; якщо якось магічно h 1 завжди постійний, рішення буде T ( n , h ) = O ( n ) .T(n,h)=O(nlogh)hh1h2h/2h1T(n,h)=O(n)

Я використовував варіант цього повторення в одній з моїх перших обчислювальних топологічних робіт :

T(n,g)={O(n)if n3 or g=0T(n1,g1)+T(n2,g2)+O(min{n1,n2})otherwise
де і g 1 + g 2 = g . Знову ж таки, рішення - O ( n log g ) , інайгіршийвипадок виникає, коли і n, і g завжди розподіляються рівномірно.n1+n2=ng1+g2=gO(nlogg)ng

У мене проблеми з умовою "якщо або h = O ( 1 ) "; що тут означає O ? Чи існують глобально обмежуючі константи, які n та h доводиться недооцінювати в кінцевому підсумку у випадку однієї (а автори не намагаються їх дати). Тому що, якщо я читаю це буквально (тобто інтерпретую O ( 1 ) так само, як O ( n ) в одному рядку), випадок два ніколи не відбувається або завжди (я навіть не впевнений). Зловживання нотацією занадто далеко, імхо. n=O(1)h=O(1)OnhO(1)O(n)
Рафаель

1
Вибачте, я змінив свою відповідь, щоб уточнити. означав "улюблену постійну". У моїй редакції я використав 3 , але 10 10 100 ! працював би так само добре. O(1)31010100!
JeffE

Як ви малювали ці схеми в документах обчислювальної топології?
користувач119264

12

Рекурсія, яку я використав у своїй роботі "Алгоритм лінійного часу для обчислення діаграми Вороного на опуклий багатокутник" Аггарваль та ін , також є досить складною.

Ось опис алгоритму з нашої роботи. Якщо це не зрозуміло з опису, на кроці 3 червоні точки діляться на малинові та гранатні точки. Етапи 1, 3 і 6 - це лінійний час. Також ми знаємо, що якщо - загальна кількість балів, | Б | α n , | R | β n , та | C | γ n для деяких α , β , γ > 0 .n|B|αn|R|βn|C|γnα,β,γ>0

Я дозволю вам зрозуміти, чому весь алгоритм займає лінійний час.

  1. Розділіть початкові точки на сині та червоні множини B та R.
  2. Рекурсивно обчислюють опуклий корпус синіх точок.
  3. Використовуючи структуру блакитного корпусу, виберіть малинові точки C.
  4. Додайте багряні точки до синього корпусу по одному.
  5. Рекурсивно обчислюють опуклий корпус гранатних точок G.
  6. Об'єднайте цей корпус граната з розширеним синім корпусом кроку 4.

Те, що робить алгоритм лінійним - це можливість додавати фіксовану частку червоних точок до синього корпусу при постійній вартості за очко. Додані бали - малинові.

Т(н)=Т(|Б|)+Т(|Г|)+О(н)
|Б||Г| але гарантовано це |Б|+|Г|(1-γ)н.

7

There is a variation on the median finding recurrence that comes from range searching with halfplanes. The recurrence itself is of the form

T(n)=T(n/2)+T(n/4)+cn
which is similar to the median-finding recurrence. For more on this, look at Jeff Erickson's lecture notes and in particular Section 4.

1
Моя відповідь тут ( cs.stackexchange.com/questions/332/… ) трапляється точно так само повторюється за час її роботи :)
Алекс десять Бринк

6

Існує купа крутих рекурсивних алгоритмів [1], [2], які використовуються для прогнозування вторинної структури РНК. Залишивши власні пристрої, ланцюжок РНК утворюватиме основи з собою; один порівняно простий приклад з [3] обчислює максимальну кількість вкладених, парних баз, що утворює рядок РНК із собою:

M(i,j)=maxik<jLmin{M(i,k1)+M(k+1,j1)+1M(i,j1)


  1. Optimal computer folding of large RNA sequences using thermodynamics and auxiliary information by M. Zuker, P. Stiegler (1981)

  2. A Dynamic Programming Algorithm for RNA Structure Prediction Including Pseudoknots by E. Rivas, S. R. Eddy (1999)

  3. Fast algorithm for predicting the secondary structure of single-stranded RNA by R. Nussinov, A. B. Jacobson (1980)


A related one proposed here is quite intricate as it sports three mutually dependent (dynamic programming) recursions.
Raphael

4

I still don't really understand what you mean by "sophisticated recursion". For example, the recursion step in the FFT algorithm is sophisticated!

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


Що ж, рекурсія у FFT (найпростіша форма Кулі-Тукі) - це "стандартне" ділення та підкорення. Це видно з його складності O (nlogn). 2 рекурсивні дзвінки (1 для парних, 1 для шансів) дещо "однакові".
elektronaj

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