Exemples d'algorithmes récursifs sophistiqués


14

J'expliquais à un ami le célèbre algorithme de sélection déterministe du temps linéaire ( algorithme de la médiane des médianes).

La récursivité dans cet algorithme (tout en étant très simple) est assez sophistiquée. Il existe deux appels récursifs, chacun avec des paramètres différents.

J'essayais de trouver d'autres exemples d'algorithmes récursifs aussi intéressants, mais je n'en ai trouvé aucun. Tous les algorithmes récursifs que je pourrais proposer sont soit de simples récursions de queue, soit de simples divisions et conquêtes (où les deux appels sont "les mêmes").

Pouvez-vous donner quelques exemples de récursivité sophistiquée?


Traverser un labyrinthe ou plus généralement un graphique avec une recherche en premier est un exemple simple d'une récursion intéressante.

utdiscant, je pense que BFS ne répond pas à ma question, car il peut facilement et naturellement être implémenté en utilisant une file d'attente et une boucle while.
elektronaj

Qu'en est-il du retour en arrière pour résoudre des énigmes et analyser? Et les algorithmes de classement et de classement ont également des récursions non standard.
uli

Algorithmes de mémorisation ?
Kaveh

2
@vzn: Une file d'attente ne peut pas remplacer une pile. BFS est un cas particulier.
Raphael

Réponses:


15

Ma récurrence préférée apparaît dans les algorithmes sensibles à la sortie pour le calcul des coques convexes, d'abord par Kirkpatrick et Seidel , mais répétés plus tard par d'autres. Soit n 3  ou  h 3 T ( n 1 , h 1 ) + T ( n 2 , h 2 ) + O ( n ) sinonn 1 ,T(n,h) le temps de calculer la coque convexe de points dans le plan, lorsque la coque convexe a h sommets. (La valeur de h n'est pas connue à l'avance, à part la borne triviale h n .) L'algorithme de Kirkpatrick et Seidel donne la récurrence T ( n , h ) = { O ( n ) si nhhhn

T(n,h)={O(n)si n3 ou h3T(n1,h1)+T(n2,h2)+O(n)autrement
et n 1 + n 2 = n et h 1 + h 2 = h .n1,n23n/4n1+n2=nh1+h2=h

T(n,h)=O(nJournalh)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
n1+n2=ng1+g2=gO(nlogg)ng

n=O(1)h=O(1)OnhO(1)O(n)
Raphael

1
O(1)3dixdix100!

Comment avez-vous dessiné ces diagrammes dans les articles sur la topologie informatique?
user119264

12

La récursion que j'ai utilisée dans mon article "Un algorithme à temps linéaire pour calculer le diagramme de Voronoï d'un polygone convexe" par Aggarwal et al est également assez compliquée.

n|B|αn|R|βn|C|γnα,β,γ>0

Je vous laisse comprendre pourquoi tout l'algorithme prend du temps linéaire.

  1. Partitionnez les points d'origine dans les ensembles bleu et rouge B et R.
  2. Calculer récursivement la coque convexe des points bleus.
  3. En utilisant la structure de la coque bleue, sélectionnez les points cramoisis C.
  4. Ajoutez les points cramoisis à la coque bleue un par un.
  5. Calculer récursivement la coque convexe des points grenat G.
  6. Fusionnez cette coque grenat avec la coque bleue expansée de l'étape 4.

Ce qui rend l'algorithme linéaire, c'est la possibilité d'ajouter une fraction fixe des points rouges à la coque bleue à un coût par point constant. Les points ajoutés sont les points cramoisis.

T(n)=T(|B|)+T(|g|)+O(n)
|B||g||B|+|g|(1-γ)n

7

Il y a une variation sur la récurrence médiane de la découverte qui provient de la recherche de distance avec des demi-plans. La récurrence elle-même est de la forme

T(n)=T(n/2)+T(n/4)+cn

1
Ma réponse ici ( cs.stackexchange.com/questions/332/… ) se trouve avoir exactement la même récurrence pour sa durée de fonctionnement :)
Alex ten Brink

6

Il existe un tas d'algorithmes récursifs sympas [1], [2] utilisés dans la prédiction de la structure secondaire de l'ARN. Laissé à lui-même, un brin d'ARN formera des paires de bases avec lui-même; un exemple relativement simple de [3] calcule le nombre maximum de bases appariées imbriquées qu'une chaîne d'ARN formera avec elle-même:

M(je,j)=muneXjek<j-Lmjen{M(je,k-1)+M(k+1,j-1)+1M(je,j-1)


  1. Pliage informatique optimal de grandes séquences d'ARN en utilisant la thermodynamique et les informations auxiliaires par M. Zuker, P. Stiegler (1981)

  2. Un algorithme de programmation dynamique pour la prédiction de la structure de l'ARN incluant les pseudoknots par E. Rivas, SR Eddy (1999)

  3. Algorithme rapide pour prédire la structure secondaire de l'ARN simple brin par R. Nussinov, AB Jacobson (1980)


Un rapport connexe proposé ici est assez complexe car il arbore trois récursions mutuellement dépendantes (programmation dynamique).
Raphael

4

Je ne comprends toujours pas vraiment ce que vous entendez par "récursion sophistiquée". Par exemple, l'étape de récursivité dans l'algorithme FFT est sophistiquée!

Mais si vous souhaitez rechercher une récursivité plus compliquée , la récurrence mutuelle pourrait être une réponse possible. La récursion mutuelle est utile lorsque vous travaillez avec des langages de programmation fonctionnels . La récursion mutuelle est la caractéristique clé des analyseurs de descente récursifs .


Eh bien, la récursivité en FFT (forme la plus simple de Cooley-Tukey) est une division et une conquête "standard". Cela ressort de sa complexité O (nlogn). Les 2 appels récursifs (1 pour le pair, 1 pour les cotes) sont quelque peu "identiques".
elektronaj

3

Du haut de ma tête, la fonction McCarthy 91

F(N) = 
    n - 100    if n > 100
    F(F(n+11)) if n <= 100

et la fonction Ackermann

A(m, n) = 
    n + 1             if m = 0
    A(m-1, 1)         if m > 0 and n = 0
    A(m-1, A(m, n-1)) if m > 0 and n > 0

pourraient compter comme des fonctions récursives décalées, bien que trop amusantes.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.