Entra^ınement au concours ACM-ICPC
Algorithmes de texte
Plan
Recherche de (sous-)cha^ıne
Expressions rationnelles et automates Conclusion
Trouver toutes les occurrences d’une sous- cha^ıne dans une cha^ıne
Algorithme na¨ıf
// s est la cha^ıne , p le m o t i f
for(int i =0 , j ; i < s . s i z e () - p . s i z e ( ) + 1 ; + + i ) { for( j =0; j < p . s i z e () && s [ i + j ]== p [ j ] ; + + j )
;
if( j == p . s i z e ())
c o u t < < " M a t c h ␣ `a ␣ la ␣ p o s i t i o n ␣ " < < i < < e n d l ; }
En g´en´eral, similaire `a l’impl´ementation native du langage (strstr, string::find, String.indexOf()), fortement optimis´ee
Complexit´eO(|s| × |p|)
Knuth–Morris–Pratt : id´ ee
p motif,s cha^ıne
Pour chaque pr´efixe p′ de p, maintenir la taille du pr´efixe maximal dep qui est un suffixe strict dep′
p =“abcabd” 00120
Tableau constructible en temps lin´eaire en le motif p s =“abcababcabd”
abcabd
Knuth–Morris–Pratt : id´ ee
p motif,s cha^ıne
Pour chaque pr´efixe p′ de p, maintenir la taille du pr´efixe maximal dep qui est un suffixe strict dep′
p =“abcabd” 00120
Tableau constructible en temps lin´eaire en le motif p s =“abcababcabd”
abcabd
Knuth–Morris–Pratt : id´ ee
p motif,s cha^ıne
Pour chaque pr´efixe p′ de p, maintenir la taille du pr´efixe maximal dep qui est un suffixe strict dep′
p =“abcabd” 00120
Tableau constructible en temps lin´eaire en le motif p s =“abcababcabd”
abcabd
Knuth–Morris–Pratt : id´ ee
p motif,s cha^ıne
Pour chaque pr´efixe p′ de p, maintenir la taille du pr´efixe maximal dep qui est un suffixe strict dep′
p =“abcabd” 00120
Tableau constructible en temps lin´eaire en le motif p s =“abcababcabd”
abcabd
Knuth–Morris–Pratt : id´ ee
p motif,s cha^ıne
Pour chaque pr´efixe p′ de p, maintenir la taille du pr´efixe maximal dep qui est un suffixe strict dep′
p =“abcabd” 00120
Tableau constructible en temps lin´eaire en le motif p s =“abcababcabd”
abcabd
Knuth–Morris–Pratt :
interpr´ etation comme automate
Peut-^etre vu comme l’automate d´eterministe des mots ayant pour suffixe p :
1 a 2 b 3 c 4 a 5 b 6 d 7
̸=a a
̸=a,b
̸=a,c
̸=a
̸=a,b
̸=a,c,d
c
̸=a
a
a a
a
Recherche d’un mot
parmi un ensemble de mots
DictionnaireD den mots
Pour rechercher si un mot est dans cet ensemble : Vecteur ou liste cha^ın´ee :O(n)
Arbre binaire ´equilibr´e :O(logn)
Table de hachage :O(1) ; possibilit´es de collision,O(n) dans le pire des casTrie (ou arbre pr´efixe) :O(1)
Trie (arbre pr´ efixe)
i t
e
o n
n n a
t i
in
inn te
tea ten
to
3 12 9
7 5
11
ted d
A
A 15
4
Arbre de tous les pr´efixes des mots de D Ar^etes ´etiquet´ees par les lettres de l’alphabet
On indique sur chaque nœud de l’arbre si ce pr´efixe forme un des mots de D Permet de rechercher efficacement l’ensemble des continuations d’un mot m dansD (l’ensemble des mots de D dont mest pr´efixe)
L’ordre lexicographique est pr´eserv´e
Arbre radix (trie Patricia)
CC-BY Claudio Rochini, Wikimedia
Raffinement des tries
Fusion d’un nœud avec son nœud fils s’il est unique
Espace m´emoire consid´erablement r´eduit dans certaines applications
Le branchement peut se faire bit par bit (quand on stocke des entiers), lettre par lettre, ou groupe de bits par groupe de bits (le nombre de bits par branchement est le radix)
Chercher les occurrences d’un ensemble de sous-cha^ınes dans une cha^ıne
DictionnaireD de taille n contenant des mots de taille k, cha^ıne de taillel
Applications r´ep´et´ees de Knuth–Morris–Pratt ?O(n×(k+l))
On peut faire mieux : g´en´eraliser l’algorithme de Knuth–Morris–Pratt `a un trie arbitraire (et non une s´equence de caract`eres) :
O(n×k+l+m) (m est la taille de la sortie)
Aho–Corasick
a b c
b a c a
b a a
CC-BY Dllu, Wikimedia
On construit un trie du dictionnaire (en noir, les mots du dictionnaire sont sur fond bleu)
On ajoute des pointeurs vers le plus grand suffixe strict pr´esent dans le trie (en bleu)
On ajoute la cl^oture transitive de ces pointeurs restreinte aux mots du dictionnaire
Exemple : abccab donne successivement les mots a (parcours normal), ab (parcours normal), bc (apr`es suivi du pointeur), c
Arbre des suffixes
3 1
5
A NA
NA NA$
$ $
BANANA$
4 2
0
NA$
$
Trie Patricia des suffixes d’un mot donn´e (ici, BANANA, suivi d’un symbole sp´ecial $)
Facilement constructible en temps O(n2) de droite `a gauche
Possible de le construire en temps O(n) de gauche `a droite, avec un m´ecanisme similaire aux pointeurs de Aho–Corasick Permet d’indexer une cha^ıne pour pouvoir ensuite efficacement rechercher des sous-cha^ınes
Nombreuses autres applications : p. ex., plus longue sous-cha^ıne commune
Plan
Recherche de (sous-)cha^ıne
Expressions rationnelles et automates Conclusion
Expressions rationnelles
Langage permettant de d´ecrire des motifs `a rechercher dans une cha^ıne de caract`eres
Par exemple : (a|b)*#(a|b)*(#(a|b|#)*)?
G´en´eralise la recherche de sous-cha^ınes, de mots d’un dictionnaire, de pr´efixes, de suffixes, etc.
Processeurs d’expressions rationnelles dans la biblioth`eque standard de Java (java.util.regex) et dans la biblioth`eque standard de C++
2011 (std::regex)
Automates
Une expression rationnelle peut ^etre traduite en un automate fini nond´eterministe en temps lin´eaire (algorithme de Thompson, r´esulte en des transitions spontan´ees) ou quadratique (algorithme de Glushkov, plus petit nombre d’´etats)
Reconna^ıtre si une cha^ıne de caract`eres de longueur n est accept´ee par un automate nond´eterministe `am ´etats est enO(n×m)
Un automate nond´eterministe `am ´etats peut ^etre transform´e en automate d´eterministe `aO(2m) ´etats en temps O(2m)
Reconna^ıtre si une cha^ıne de caract`eres de longueur n est accept´ee par un automate d´eterministe `am ´etats est enO(n)
Expressions rationnelles et expressions rationnelles
Ce que Java ou C++ appellent expression rationnelle n’est pas une expression rationnelle :
R´ef´erences arri`eres (permettant d’indiquer qu’une sous-cha^ıne se r´ep`ete) Op´erateur*glouton et* ?r´eticent
Du coup, les impl´ementations des expressions rationnelles n’utilisent pas des automates, mais du backtracking
Souvent beaucoup moins efficaces ! Exponentiel en la taille de l’expression rationnelle dans les cas pathologiques
Plan
Recherche de (sous-)cha^ıne
Expressions rationnelles et automates Conclusion
En r´ esum´ e
D´eterminer si une cha^ıne est dans un ensemble de cha^ınes : table de hachage
D´eterminer les cha^ınes d’un ensemble dont une cha^ıne est pr´efixe : trie, arbre radix
Recherche d’une petite sous-cha^ıne d’une cha^ıne : impl´ementation native du langage de programmation
Recherche d’une sous-cha^ıne de taille non n´egligeable d’une longue cha^ıne : Knuth–Morris–Pratt (ou Boyer–Moore, non trait´e ; KMP est meilleur quand l’alphabet est petit, p. ex., ACTG de l’ADN)
Recherche d’un ensemble de sous-cha^ınes dans une cha^ıne : Aho–Corasick ou arbre des suffixes (Aho–Corasick indexe les sous-cha^ınes, l’arbre des suffixes indexe la cha^ıne)
Recherche d’un motif complexe dans une cha^ıne : expression rationnelle
Licence de droits d’usage
Contexte public}avec modifications
Par le t´el´echargement ou la consultation de ce document, l’utilisateur accepte la licence d’utilisation qui y est attach´ee, telle que d´etaill´ee dans les dispositions suivantes, et s’engage `a la respecter int´egralement.
La licence conf`ere `a l’utilisateur un droit d’usage sur le document consult´e ou t´el´echarg´e, totalement ou en partie, dans les conditions d´efinies ci-apr`es et `a l’exclusion expresse de toute utilisation commerciale.
Le droit d’usage d´efini par la licence autorise un usage `a destination de tout public qui comprend : – le droit de reproduire tout ou partie du document sur support informatique ou papier,
– le droit de diffuser tout ou partie du document au public sur support papier ou informatique, y compris par la mise `a la disposition du public sur un r´eseau num´erique,
– le droit de modifier la forme ou la pr´esentation du document,
– le droit d’int´egrer tout ou partie du document dans un document composite et de le diffuser dans ce nouveau document, `a condition que : – L’auteur soit inform´e.
Les mentions relatives `a la source du document et/ou `a son auteur doivent ^etre conserv´ees dans leur int´egralit´e.
Le droit d’usage d´efini par la licence est personnel et non exclusif.
Tout autre usage que ceux pr´evus par la licence est soumis `a autorisation pr´ealable et expresse de l’auteur :sitepedago@telecom-paristech.fr