Infos et théorie
Aho–Corasick trouve chaque occurrence de plusieurs
motifs dans un texte en un seul passage linéaire, en combinant
un trie de tous les motifs avec des
liens d'échec, qui généralisent l'idée sur
laquelle repose l'algorithme mono-motif
KMP.
1. Construction du trie
Chaque motif est inséré dans un trie partagé, dont la racine
est le nœud 0. Chaque nœud correspond à la chaîne
formée par le chemin depuis la racine ; un nœud est marqué
comme nœud de sortie si ce chemin correspond à
l'un des motifs.
2. Liens d'échec (BFS)
Pour chaque nœud v, atteint depuis le nœud parent
u via le caractère
c, le lien d'échec f(v)
pointe vers le nœud correspondant au plus long suffixe propre
de la chaîne du nœud v qui soit aussi un préfixe
d'un motif (c'est-à-dire également un nœud du trie). Les liens
d'échec sont calculés par un parcours BFS du
trie, niveau par niveau : les enfants de la racine reçoivent
f = racine ; pour un descendant plus profond
atteint depuis u via c, on parcourt
la chaîne de liens d'échec de u jusqu'à trouver un
nœud possédant une transition goto sur
c (ou jusqu'à revenir à la racine).
3. Sortie / liens de suffixes du dictionnaire
Un même nœud peut être simultanément le suffixe de plusieurs
motifs correspondants ; l'ensemble effectif des
correspondances de chaque nœud est donc constitué de ses
propres outputs plus toutes les sorties
accessibles en suivant les liens d'échec jusqu'à la
racine — la chaîne de suffixes du dictionnaire. Le
calcul préalable de cet ensemble fusionné (ou son parcours en
temps réel) permet au scanner de signaler chaque motif se
terminant à une position donnée, sans omettre aucune
correspondance qui se chevauche.
4. Analyse
Le texte est fourni caractère par caractère. Depuis l'état courant, on emprunte la transition du trie si elle existe ; sinon, on applique successivement les liens d'échec jusqu'à trouver une transition ou à atteindre la racine. Après chaque transition, l'ensemble fusionné des sorties du nouvel état est signalé comme les correspondances se terminant à cette position.
Complexité
La construction du trie et des liens d'échec coûte
O(m), où m est la longueur cumulée de
tous les motifs ; l'analyse du texte coûte O(n),
où n est la longueur du texte. La sortie de
toutes les correspondances coûte O(z), où
z est le nombre de correspondances, soit au total
O(n + m + z).