Algorithme d'Ukkonen
En informatique, l'algorithme d'Ukkonen construit incrĂ©mentalement en temps linĂ©aire l'arbre des suffixes d'un mot. Cet algorithme a Ă©tĂ© proposĂ© par Esko Ukkonen (en) en 1995[1]. L'algorithme est essentiellement la linĂ©arisation d'une version naĂŻve quadratique d'un algorithme de construction de lâarbre des suffixes.
DĂ©couvreur ou inventeur |
Esko Ukkonen (en) |
---|---|
Date de découverte |
1995 |
ProblÚme lié |
Recherche des suffixes dans une chaĂźne de caractĂšres |
Structure des données |
Pire cas | |
---|---|
Moyenne |
Principe
L'algorithme d'Ukkonen lit les caractĂšres les l'un aprĂšs l'autre, en faisant grossir la structure qu'il produit, de telle sorte que, Ă tout instant, l'arbre obtenu est l'arbre des suffixes du prĂ©fixe lu. Cette lecture des caractĂšres du mot, qui progresse de gauche Ă droite, confĂšre Ă l'algorithme d'Ukkonen son incrĂ©mentalitĂ©. Dans le premier algorithme de construction de lâarbre des suffixes, proposĂ© par Peter Weiner, celui-ci lit le mot du dernier caractĂšre au premier, produisant les arbres des suffixes, du plus petit suffixe du mot donnĂ© au plus grand suffixe du mot (c'est-Ă -dire le mot lui-mĂȘme)[2]. Edward M. McCreight propose plus tard un algorithme plus simple, allant toujours de droite Ă gauche dans la lecture du mot[3]. Dans sa prĂ©sentation, Esko Ukkonen propose d'abord sa version quadratique incrĂ©mentale de gauche Ă droite qu'il linĂ©arise ensuite.
L'implĂ©mentation naĂŻve de la construction d'un arbre de suffixes en lisant le mot du dĂ©but Ă la fin requiert une complexitĂ© temporelle O (n2) voire O(n3) en notation de Landau, oĂč n est la longueur de la chaĂźne. En exploitant un certain nombre de techniques algorithmiques, l'algorithme d'Ukkonen rĂ©duit ce temps Ă O(n) (linĂ©aire), pour les alphabets de taille constante, et O(n log n) en gĂ©nĂ©ral, correspondant aux performances d'exĂ©cution des deux prĂ©cĂ©dents algorithmes.
Exemple
Explicitons l'exécution sur le mot . L'algorithme part de l'arbre ne contenant qu'une racine. Lisons les lettres de de gauche à droite.
Ătape 1 : insertion de dans l'arbre.
Comme aucune arĂȘte partant de la racine n'est Ă©tiquetĂ©e par , on construit un nĆud correspondant au suffixe . Ă ce stade, on a construit un arbre suffixe correspondant au mot dont le seul suffixe est .
Ătape 2 : insertion de dans l'arbre.
à ce stade, le mot entier considéré est . Le suffixe devient et on ajoute le suffixe dans l'arbre.
Ătape 3 : insertion de dans l'arbre.
à ce stade, le mot entier considéré est . Comme précédemment, on met à jour les suffixes et qui deviennent respectivement et puis on ajoute comme suffixe.
Ătape 4 : insertion de dans l'arbre.
Ă ce stade, le mot entier considĂ©rĂ© est . On met Ă jour les suffixes , et qui deviennent respectivement , et . En revanche, il n'est pas nĂ©cessaire d'insĂ©rer le suffixe qui est dĂ©jĂ prĂ©sent dans l'arbre via l'arĂȘte . (on retient maintenant que les prochaines modifications vont avoir lieu sur l'arĂȘte , et que le plus long prĂ©fixe commun est . On garde ces informations).
Ătape 5 : insertion de (mot considĂ©rĂ© est ) :
L'arĂȘte courante est , dont est toujours le prĂ©fixe. Il suffit donc de mettre Ă jour les suffixes , et qui deviennent , et . Le plus long prĂ©fixe commun devient .
Ătape 6 insertion de (mot considĂ©rĂ© est ) :
Les suffixes , et deviennent , et . En revanche, le suffixe n'est plus prĂ©fixe de . Il faut scinder l'arĂȘte aprĂšs qui est le plus long prĂ©fixe commun.
- Ătape 6.1 : on insĂšre un nĆud entre et , puis on rajoute une arĂȘte partant de ce nĆud (on a introduit un branchement). On a ainsi ajoutĂ© les suffixes et dans l'arbre. Il reste Ă traiter les suffixes et .
- Ătape 6.2 : le suffixe a comme plus long prĂ©fixe commun avec l'arĂȘte . On sĂ©pare donc l'arĂȘte en insĂ©rant un nĆud entre et . On ajoute Ă©galement une arĂȘte partant de ce nĆud
- Ătape 6.3 : le suffixe a comme plus long prĂ©fixe avec l'arĂȘte . On insĂšre donc encore un nĆud entre et sur l'arĂȘte
Articles connexes
Bibliographie
- (en) E. Ukkonen, « On-line construction of suffix trees », Algorithmica, vol. 14, no 3,â , p. 249â260 (DOI 10.1007/BF01206331, lire en ligne)
- (en) Peter Weiner, 14th Annual Symposium on Switching and Automata Theory (SWAT 1973), , 1â11 p. (DOI 10.1109/SWAT.1973.13), « Linear pattern matching algorithms »
- (en) Edward Meyers McCreight, « A Space-Economical Suffix Tree Construction Algorithm », Journal of the ACM, vol. 23, no 2,â , p. 262â272 (DOI 10.1145/321941.321946)
Liens externes
- Explication détaillée en anglais
- Recherche rapide de chaßnes avec des arbres de suffixes Tutoriel de Mark Nelson. Présente un exemple d'implémentation écrit en C++.
- Implémentation en C avec explication détaillée
- Diapositives de la conférence de Guy Blelloch
- Page d'accueil d'Ukkonen
- Projet d'indexation de texte (construction en temps linéaire d'Ukkonen d'arbres de suffixes)
- Implémentation en C Partie 1 Partie 2 Partie 3 Partie 4 Partie 5 Partie 6