Arbre des suffixes : algorithme d Ukkonen Thierry Lecroq Université de Rouen
Algorithme d Ukkonen L algorithme de construction de l arbre l des suffixes d un d mot y de longueur n d Ukkonen est un algorithme incrémental qui insert une à une les lettres de y dans l arbre l de la première à la dernière. re. 2
Algorithme d Ukkonen On ajoute le terminateur $ au mot y : y = y[0.. [0..n-1]$ avec $ alph(y) 3
Définition L arbre implicite des suffixes de y est obtenu à partir de l arbre l des suffixes de y$ en supprimant toutes les occurrences du symbole $,, puis en supprimant toutes les branches sans étiquettes, puis en supprimant tous les nœuds n internes qui n ont pas au moins deux descendants. 4
Définition L arbre implicite de suffixes de y[0.. [0..i]] est noté T i. 5
Exemple y = tagta ta gta$ $ gta$ $ a $ gta$ 0 3 1 4 5 2 arbre des suffixes de tagta$ tagta agta gta 0 1 2 arbre implicite des suffixes de tagta 6
Algorithme d Ukkonen On associe chaque nœud n interne avec le mot formant l étiquette l depuis la racine à ce nœudn interne. Ainsi la racine est associée à ε. On associe l indice l j à la feuille au bout du chemin étiqueté par y[j....n]] depuis la racine. 7
Un premier algorithme en O(n 3 ) n phases la phase i+1 construit T i+1 à partir de T i divisée e en i+2 extensions l extension j insère y[j....i+1] dans l arbre l en recherchant la fin du chemin étiqueté par y[j....i]] depuis la racine de T i rajoutant y[i+1] si nécessairen 8
algo UKKONEN 1 (y, n) n construire T 0 pour i 0 à n-1 faire // phase i+1 pour j 0 à i+1 faire // extension j trouver la fin du chemin étiqueté par y[j....i]] depuis la racine ajouter y[i+1] si nécessairen 9
Règles d extension des suffixes Durant l extension l j de la phase i+1, l algorithmel trouve la fin du chemin étiqueté par y[j....i]] depuis la racine pour, éventuellement, ajouter y[i+1]. Cet ajout se fait alors en accord avec 3 règles. r 10
Règle 1 Le chemin étiqueté par y[j....i]] depuis la racine se termine sur une feuille, y[i+1] est alors ajouté à la fin de l étiquette l de la branche menant à la cette feuille. 11
Règle 2 Le chemin étiqueté par y[j....i]] depuis la racine ne se termine pas sur une feuille. Aucun chemin étiqueté par y[i+1] ne commence après s ce chemin. Dans ce cas une nouvelle feuille est créé éée e avec une branche y menant étiquetée e par y[i+1]. Si le chemin étiqueté par y[j....i]] depuis la racine ne se termine pas sur un nœud n alors un nouveau nœud doit être créé et la branche cassée. 12
Règle 3 Le chemin étiqueté par y[j....i]] depuis la racine ne se termine pas sur une feuille. Un chemin étiqueté par y[i+1] commence après ce chemin. Donc y[j....i+1] est déjà d dans l arbre l : on ne fait rien. 13
Lien suffixe On définit d le lien suffixe d un d nœud n interne av par s(av) ) = v avec a une lettre et v un mot. 14
Lemme 1 Si un nouveau nœud n interne av est ajouté à l arbre pendant l extension l j de la phase i+1 alors soit il y a déjà d un nœud n interne v dans l arbre l ; soit un nœud n interne v va être créé dans l extension j+1 de la phase i+1. 15
Preuve Un nouveau nœud n interne av est créé dans l extension j (de la phase i+1) uniquement lorsque la règle r d extension d 2 s applique. s Cela signifie que dans l extension l j,, le chemin étiqueté par av se poursuit par une lettre différente c de y[i+1]. Donc lors de l extension l j+1, il y a un chemin v qui se poursuit par c. Il y a alors 2 cas. 16
Preuve (suite) Soit le chemin v est poursuivi uniquement par la lettre c et la règle r 2 crée e un nœud n s(av) à la fin du chemin v ; Soit le chemin v est poursuivi par au moins 2 lettres différentes et dans ce cas un nœud n s(av) existe déjà d ; dans les 2 cas, le lemme est prouvé. 17
Corollaire 2 Dans l algorithme l d Ukkonend Ukkonen,, tout nouveau nœud interne créé aura un lien suffixe avant la fin de l extension l suivante. 18
Corollaire 3 Dans un arbre implicite des suffixes T i, s il s y a un nœud n interne av alors il y a un nœud n interne v. 19
algo EXTENSION(j) trouver le premier nœud n v au dessus de y[j-1.. -1..i]] qui possède un lien suffixe soit u l étiquette de la branche entre v et y[j-1.. -1..i] si v racine alors v s(v) suivre le chemin étiqueté par u depuis v utiliser les règles r d extension d pour s assurer s que y[j....i+1] est dans l arbrel si un nœud n w avait été créé pendant l extension l j-1 alors mettre s(w) à jour 20
Astuce 1 Les étiquettes sont représent sentées es par des couples (position, longueur). Lorsque l algorithme l doit suivre le chemin étiqueté par u à partir de s(v) ) (ou la racine), puisqu on est assuré de trouver ce chemin le parcours de ce chemin s effectue s en temps proportionnel au nombre de nœuds n du chemin. Donc le temps nécessaire n pour tous les parcours de ce type est O(n). 21
Définition La profondeur en nœud n d un d nœud n interne v est le nombre de nœuds n sur le chemin de la racine au nœud v. 22
Lemme 4 Lorsque l algorithme l d Ukkonend emprunte un lien suffixe de v à s(v), à ce moment là, l, la profondeur en nœud n de v est au plus un plus la profondeur en nœud n de s(v). 23
Théorème 5 En utilisant les liens suffixes et l astuce l 1, une phase de l algorithme l d Ukkonend s exécute en O(n). 24
Corollaire 6 En utilisant les liens suffixes et l astuce l 1, l algorithme d Ukkonend s exécute en O(n 2 ). 25
Observation 1 Durant une phase i+1, si la règle r d extension d 3 s applique à l extension j,, elle s appliquera s aussi aux extensions j+1 à i+1. 26
Astuce 2 Une phase i+1 s arrs arrête dès d s que la règler d extension 3 s applique s lors d une d extension. 27
Observation 2 Dès s qu une une feuille étiquetée j est créé éée e lors d uned phase, la règle r d extension d 1 s y s y appliquera pour chaque extension de toutes les phases suivantes. 28
Astuce 3 Les branches menant aux feuilles sont étiquetéeses par (i,( ). 29
Feuille Soit f l indice de la dernière re feuille créé éée e dans l arbre en cours de construction. 30
algo PHASE(i) j f répéter j j+1 EXTENSION(j) jusqu à j = i+1 ou la règle r 3 s appliques f j-1 31
algo UKKONEN(y, n) n construire T 0 f 0 pour i 0 à n-1 faire PHASE(i) 32
Théorème 7 L algorithme d Ukkonend s exécute en temps O(n). 33
Détails d implantation Les étiquettes des branches sont stockées dans les nœuds d arrivd arrivée. Un nœud n contient les informations suivantes : parent : le nœud n parent ; s : le lien suffixe ; longueur : la longueur de l étiquette l de la branche menant au nœud n ; position : la position de l étiquette l de la branche menant au nœud. n 34
algo ARBRE-DES-SUFFIXES(y,n y,n) racine nouveau nœudn feuille nouveau nœudn créer la transition (racine( racine,, (0, ), feuille) s(racine) racine derniernœud racine nœud racine g 0 j 0 35
pour i 1 à n - 1 faire tantque j i faire si g = 0 ou g = longueur(nœud ud) alors si CIBLE-PAR-UNE-LETTRE(nœud ud, y[i]) est définied alors nœud CIBLE-PAR-UNE-LETTRE(nœud ud, y[i]) g 1 rupture // règle r 3 sinon feuille nouveau nœudn créer la transition (nœud( ud,, (j,( ), feuille) si s(derniernœud) ) n est n pas défini d alors s(derniernœud) nœud derniernoeud nœud 36
sinon si y[i] ] = y[position(nœud)+ )+g] alors g g + 1 rupture // règle r 3 sinon nœudparent parent(nœud ud) nœud COUPE(nœudParent udparent, nœud, g) feuille nouveau nœudn créer la transition (nœud( ud,, (j,( ), feuille) si s(derniernœud) ) n est n pas défini d alors s(derniernœud) nœud derniernoeud nœud 37
si nœud racine alors si g = longueur(nœud ud) et s(nœud) ) est définid alors nœud s(nœud) g longueur(nœud ud) j j + 1 continuer nœudparent parent(nœud ud) si nœudparent racine alors nœud s(nœudparent) sinon nœud racine g g - 1 38
h i - g tantque g > 0 faire // descente rapide nœud CIBLE-PAR-UNE-LETTRE(nœud ud, y[h]) g longueur(nœud ud) si g > g alors rupture sinon g g - g h h + g si g = 0 alors si s(derniernœud) ) n est n pas défini d alors s(derniernœud) nœud derniernoeud nœud si nœud racine alors g longueur(nœud ud) j j + 1 39
algo COUPE(nœudParent udparent, nœud, g) p position(nœud ud) l longueur(nœud ud) détruire la branche (nœudparent( udparent, nœud) nouveaunoeud nouveau nœudn créer la transition (nœudparent( udparent,, (p,( l), nouveaunœud ud) créer la transition (nouveaun( nouveaunœud,, (p+g,( l g), nœud) retourner nouveaunœud ud 40