Algorithmique 4. Cours 3
Marie-Pierre B´eal d’apr`es Maxime Crochemore
http://www.dcs.kcl.ac.uk/staff/mac/TSP/index.html
Recherche d’un motif dans un texte
Chaˆınes de caract`eres
Alphabet : un ensemble fini de lettres. A={a,b,c, . . . ,}.
Mots : A∗ suites finies de lettres. Le mot vide est not´eε.
La longueur d’un mot x est not´ee|x|.
Notation x=x[0]x[1]· · ·x[|x| −1] =abaaabababa.
i 0 1 2 3 4 5 6 7 8 9 10
x[i] a b a a a b a b a b a
Chaˆınes de caract`eres
Pr´efixe : x est pr´efixe dey s’il existe un mot z tel quey =xz.
Suffixe : x est suffixe de y s’il existe un mot z tel quey =zx.
Facteur : x est facteur dey s’il existe des mot z,t tel quey =zxt.
Positions : x apparaˆıt dansy en positioni si y =uxv et|u|=i, ou encore si x =y[i]y[i + 1]...y[i+|x| −1] =y[i,i+|x| −1].
P´eriodes et bords
Soit x un mot non vide etp un entier tel que 0<p ≤ |x|.
p est une p´eriode dex si l’une des conditions ´equivalentes suivantes est satisfaite.
1 x[i] =x[i+p], pour 0≤i <|x| −p.
2 x est pr´efixe deyk, pour un entierk>0,|y|=p.
3 x =yw =wz, pour des motsy,z,w avec|y|=|z|=p. Une telle chaˆıne w est appel´ee unbordde x.
La p´eriode dex,period(x), est sa plus petite p´eriode (peut ˆetre
´egale `a |x|).
Le bord dex est son plus long bord (peut ˆetre le mot vide) P´eriodes et bords de abacabacaba
4 abacaba
8 aba
10 a 11 ε
Recherche d’un motif dans un texte
texte
pattern
✲
✛
position de l’occurrence
Probl`eme
Trouver toutes les occurrences du motif (ou pattern)x de longueurm dans le textey de longueurn.
Plusieurs solutions selon que l’on consid`ere que
Le pattern est fix´e : solutions avec un pr´e-traitement du pattern.
Le texte est fix´e : solutions bas´ees sur la construction d’un index.
”Pattern matching”
Etant donn´e un pattern´ x, trouvertoutes les positions dex dans n’importe quel texte y.
Pattern : une suite x dem symboles.
t a t a
Texte : une suite y den symboles.
c a c g t a t a t a t g c g t t a t a Occurrences en positions 4, 6, 15.
c a c g t a t a t a t g c g t t a t a
t a t a t a t a
t a t a
Op´eration de base: comparaison de symboles (=,6=)
Strat´egie de la fenˆetre glissante
textey
patternx
✞ ☎
fenˆetre
scan . . . scan . . . scan
✲
d´ecalage✲ d´ecalage
Scan et d´ecalage de la fenˆetre
mettre la fenˆetre au d´ebut du texte whilefenˆetre est sur le texte do
scan:iffenˆetre = patternthen enregistrer une occurrence d´ecalage: d´ecaler la fenˆetre vers la droite et m´emoriser des informations pour les scans et d´ecalages futurs
Algorithme na¨ıf
c a c g t a t a t a t g c g t t a t
t a t a
Principe
On ne m´emorise rien. On d´ecale de 1 position `a droite Complexit´e
temps O(m×n), espace suppl´ementaireO(1) Nombre de comparaisons de symboles
au maximum≈m×n en moyenne ≈2×n
sur un alphabet `a deux lettres avec des sources sans m´emoire
´equiprobables et ind´ependantes.
Algorithme na¨ıf
u u
τ
0 σi m−1
0 pos j n−1
y
x
RechercheNa¨ıve (stringx,y; integerm,n) pos ←−0
whilepos ≤n−m do i ←−0
whilei <m and x[i] =y[pos +i]do i ←−i + 1
ifi =m then output(”x apparaˆıt dansy en position”,pos) pos ←−pos+ 1
Recherche du motif avec un automate
On utilise l’automate d´eterministe minimal A(x) acceptantA∗x, o`u Aest l’alphabet de y
Exemple x =abaa,A={a,b}
0 a 1 b 2 a 3 a 4
b a
b b
b a
Recherche de abaadans
b a b b a a b a a b a a b b a ·
´etat 0 0 1 2 0 1 1 2 3 4 2 3 4 2 0 1 ·
Algorithme de recherche du motif
Simple scan du texte avec l’automate A(x)
RechercheParAutomate (stringx,y; integerm,n) (Q,A,initial,{terminal}, δ) est l’automateA(x) q←− ´etat initial
ifq est terminal then enregistrer une occurrence dex dansy while notfin de y do
σ←− symbole suivant de y q ←−δ(q, σ)
ifq est terminal then enregistrer une occurrence dex dansy
Construction de l’automate A( x )
automate ConstructionAutomate(string x) Soitinitial un nouvel ´etat
Q←− {initial} terminal ←−initial
forallσ in Ado δ(initial, σ)←−initial while notfin de x do
τ ←− symbole suivant de x r←−δ(terminal, τ)
ajouter un nouvel ´etats `aQ δ(terminal, τ)←−s
forallσ inA doδ(s, σ)←−δ(r, σ) terminal ←−s
return(Q,A,initial,{terminal}, δ)
Complexit´e
Pattern x de taille m, texte y de taille n
Avec un automate impl´ement´e par matrice de transitions Pr´e-traitement de x temps O(m×card(A))
espace O(m×card(A))
Recherche dans le texte y temps O(n)
espace O(m×card(A))
D´elai temps constant
Am´elioration (plus difficile)
On peut calculer l’automate A(x) en temps et espace O(m) ind´ependamment de la taille de l’alphabet.
Animation de Thierry Lecroq
http ://www.dcs.kcl.ac.uk/staff/mac/TSP/DOC/Thierry-Lecroq- sma.pdf
Algorithme de Boyer-Moore
Rappel : l’algorithme na¨ıf fait un scan de gauche `a droite
a a c a a a a a b a b a a b a b . . a b a a a a
a b a a a a a b a a a a
a b a a a a a b a a a a
. . .
Scan de droite `a gauche : exemple 1
a a c a a a a a b a b a a b a b . . a b a a a a
a b a a a a a b a a a a
a b a a a a a b a a a a
. . .
Scan de droite `a gauche : exemple 2
a b a b a a a b a b b a a b a b . . a b a a a b a b
a b a a a b a b a b a a a b a b
a b a a a b a b . . .
Scan de droite `a gauche et d´ecalage
texte · · · c g c t c g c g c t a t c g · · ·
pattern c g c t a g c
c g c t a g c
c g c t a g c
r`egle de d´ecalage (fonction d) dite du ”bon suffixe”
r`egle de d´ecalage dite du ”mauvais caract`ere”
whilefenˆetre est sur le texte do
u←− plus long suffixe commun `a fenˆetre et pattern ifu= pattern thenenregistrer une occurrence d´ecaler la fenˆetre ded(u) positions `a droite
u u u τ σ i
? pos
textey
patternx ✛d´ecalage✲
u u τ σ i pos
textey
patternx ✛ d´ecalage ✲
Pr´e-calcul des occurrences les plus `a droite des motsu :O(m) Le d´ecalage de type 2 est la p´eriode de x
Le tableau D impl´emente une r`egle de d´ecalage dite r`egle ”du bon suffixe” :
d´ecalage=d(u) =D[i]
Algorithme de Boyer-Moore (r`egle ”du bon suffixe”)
u u τ σ
0 i m−1
0 pos j n−1
textey
patternx
BM(stringx,y; integer m,n) pos ←−0
whilepos ≤n−m do i ←−m−1
whilei ≥0 andx[i] =y[pos +i] doi ←−i−1 ifi =−1then
output(”x apparaˆıt dansy en position”,pos) pos ←−pos+period(x)
else
pos ←−pos+D[i]
Calcul du d´ecalage
Fonction de d´ecalage d :
d(u) = min{|z|>0|(x suffixe deuz) ou
(τuz suffixe dex et τu n’est pas suffixe de x, pourτ ∈ A)}
Tableau des d´ecalages D :
D[i] =d(x[i + 1,m−1]), pouri = 0, ..,m−1
x σ u
z′′
τ u
z′ u
Note 1 : u est un bord de uz′′
Note 2 : |z′|est une p´eriode de uz′ (et donc |z′|est une p´eriode de x)
Complexit´e de Boyer-Moore Phase de pr´e-traitement
calcul du tableau D O(m) (voir plus loin) Phase de recherche (de toutes les occurrences)
temps de calcul O(n×m)
nombre minimum de comparaisons n/m nombre maximum de comparaisons n×m
Calcul de la table des suffixes
Calcul d’un tableau Sufde taille m
Suf[i] = longueur du plus long suffixe dex qui est un bloc se terminant en position i dans x
Suf[i] i patternx
Complexit´e
La complexit´e en temps et espace du calcul deSuf sur un pattern de taillem est O(m).
i fix´e :Suf[j] connu pouri <j ≤m−1
k = min{j −Suf[j]|i <j <m} (pos. la plus `a gauche d´ej`a vue) σ 6=τ;σ′ 6=τ′;Suf[i+m−j −1] =|u′|
0 k i j i+m−j−1 m−1
x τ u σ u
τ′ u′ τ′ u′ σ′ u′
Si Suf[i+m−j−1]<i−k :Suf[i] =Suf[i+m−j −1]
0 k i j i+m−j−1 m−1
x τ u σ u
u′ τ′ u′ σ′ u′
Si Suf[i+m−j−1]>i−k :Suf[i] =i−k
0 k i j i+m−j−1 m−1
x τ u σ u
u′ σ u′ σ′ u′
Si Suf[i+m−j−1] =i−k : trouverSuf[i] en scannant`a partir de la position k. Donne un nouveau k et un nouveau j (=i)
Calcul linaire du tableau Suf , puis de D `a partir de Suf
Compute Suf(stringx; integerm)
Suf[m−1]←−m;k ←−m−1 ; j ←−m−1 ; fori ←−m−2 downto0 do
ifi >k andSuf[i+m−j−1]6=i −k then Suf[i]←−min{Suf[i +m−j −1],i−k}
else
j ←−i;k ←−min{i,k};
while k ≥0 andx[k] =x[k+m−j −1] do k ←−k−1 ;
Suf[i]←−j−k returnSuf
i 0 1 2 3 4 5 6 7 8 9 10
x[i] a b a a a b a b a b a
Suf[i] 1 0 3 1 1 0 3 0 5 0 11
Initialisation deD en utilisant les p´eriodes de x
Suf[2] = 3 =⇒ p´eriode 8 ; Suf[0] = 1 =⇒ p´eriode 10 ; p´eriode 11
8 8 8 8 8 8 8 8 10 10 11
Calcul du tableauD `a partir de Suf
Suf[3] = 1 =⇒ D[9]≤7 ; Suf[8] = 5 =⇒D[5]≤2
8 8 8 8 8 /8 8 /8 10 //10 //11
2 /8 //10 /9
4 7/ /5
6 /3 1
D[i] 8 8 8 8 8 2 8 4 10 6 1
Calcul de D `a partir de Suf
Compute D(stringx; integerm; table D) j ←−0 ;
fori ←−m−2 downto−1 do ifi =−1orSuf[i] =i+ 1then
while j <m−i−1do D[j]←−m−i−1 ; j ←−j+ 1 ;
fori ←−0 tom−2 do
D[m−Suf[i]−1]←−m−i−1 ; returnD
Algorithme de Boyer-Moore Horspool
Le d´ecalage de la fenˆetre est contrˆol´e par la r`egle dite du ”mauvais caract`ere”.
z u u τ σ i τ pos
textey
patternx ✛d´ecalage✲
✲
✛
DA[τ]
On d´efinit une tableDA indic´ee par les caract`eres.
La table DAv´erifie :
DA[τ] = min{|z|>0|τz suffixe dex} ∪ {|x|}
d´ecalage=DA[τ]− |u|=DA[τ]−m+i+ 1
Algorithme de Boyer-Moore Horspool
Calcul de la tableDA
Compute DA(stringx; integerm) forallσ in Ado
DA[σ] =m
fori ←−0 tom−2 do DA[x[i]] =m−i −1 returnDA
Algorithme de Boyer-Moore
BM(stringx,y; integer m,n) ; pos ←−0
whilepos ≤n−m do i ←−m−1
whilei ≥0 andx[i] =y[pos +i] do i ←−i −1
ifi =−1then
output(’x occurs in y at position ’, pos) pos ←−pos+period(x)
else
pos ←−pos+ max{D[i],DA[y[pos+i]]−m+i+ 1}