Wyjaśniłem przyjacielowi słynny deterministyczny algorytm wyboru czasu liniowego (mediana algorytmu median).
Rekurencja w tym algorytmie (choć jest bardzo prosta) jest dość skomplikowana. Istnieją dwa wywołania rekurencyjne, każde o różnych parametrach.
Próbowałem znaleźć inne przykłady tak interesujących algorytmów rekurencyjnych, ale nie znalazłem żadnego. Wszystkie algorytmy rekurencyjne, które mogłem wymyślić, są albo prostymi rekurencjami ogona, albo prostym dzieleniem i podbijaniem (gdzie dwa wezwania są „takie same”).
Czy możesz podać kilka przykładów wyrafinowanej rekurencji?
algorithms
recursion
elektronaj
źródło
źródło
Odpowiedzi:
Moja ulubiona rekurencja pojawia się w algorytmach wrażliwych na wyniki obliczania wypukłych kadłubów, najpierw przez Kirkpatrick i Seidel , ale później powtórzone przez innych. Niech oznacza czas obliczenia wypukłego kadłuba n punktów na płaszczyźnie, gdy wypukły kadłub ma h wierzchołków. (Wartość h nie jest z góry znana, poza trywialnym związanym h ≤ n .) Algorytm Kirkpatricka i Seidela daje powtarzalność T ( n , h ) = { O ( n ) jeśliT.( n , h ) n h h h ≤ n
przypadku gdzien1,n2≤3n/4orazn1+n2=norazh1+h2=h.
Rozwiązaniem jest . Jest to trochę zaskakujące, ponieważ h nie jest równomiernym rozłożeniem parametru. Ale w rzeczywistości najgorszy przypadek ponownego wystąpienia ma miejsce, gdy h 1 i h 2 są około h / 2 ; jeśli w jakiś sposób magicznie h 1 jest zawsze stałe, rozwiązaniem byłoby T ( n , h ) = O ( n ) .T.( n , h ) = O ( n logh ) h h1 h2) h / 2 h1 T.( n , h ) = O ( n )
Użyłem wariantu tego nawrotu w jednym z moich pierwszych artykułów z topologii obliczeniowej : przypadku gdzie
źródło
The recursion that I used in my paper "A linear-time algorithm for computing the Voronoi diagram of a convex polygon" by Aggarwal et al is also quite complicated.
Here is a description of the algorithm from our paper. In case it's not clear from the description, in step 3 the red points are partitioned into crimson and garnet points. Steps 1, 3, and 6 are all linear time. We also know that ifn is the total number of points, |B|≥αn , |R|≥βn , and |C|≥γn for some α,β,γ>0 .
I'll let you figure out why the entire algorithm takes linear time.
The recursion is thus
źródło
There is a variation on the median finding recurrence that comes from range searching with halfplanes. The recurrence itself is of the form
źródło
There are a bunch of cool recursive algorithms [1], [2] used in RNA secondary structure prediction. Left to its own devices, a strand of RNA will form base pairs with itself; one relatively simple example from [3] computes the maximum number of nested, paired bases an RNA string will form with itself:
Optimal computer folding of large RNA sequences using thermodynamics and auxiliary information by M. Zuker, P. Stiegler (1981)
A Dynamic Programming Algorithm for RNA Structure Prediction Including Pseudoknots by E. Rivas, S. R. Eddy (1999)
Fast algorithm for predicting the secondary structure of single-stranded RNA by R. Nussinov, A. B. Jacobson (1980)
źródło
I still don't really understand what you mean by "sophisticated recursion". For example, the recursion step in the FFT algorithm is sophisticated!
But if you want to look for more complicated recursion, then mutual recursion might be one possible answer. Mutual recursion is useful when working with fuctional programming languages. Mutual recursion is the key feature of recursive descent parsers.
źródło
Z czubka mojej głowy, funkcja McCarthy 91
i funkcja Ackermanna
mogą być liczone jako niecodzienne, choć zabawkowe, rekurencyjne funkcje.
źródło