V - M´ethodes num´eriques, algorithmes vectoriels Bas´ees sur une repr´esentation en bits des ´etats de la recherche.
Dans ce cas, une approche naive est consid´er´ee, et rendue rapide grˆace `a la capacit´e des langages de programmation `a manipuler les mots machine (op´erations logiques et arithm´etiques simples) Algorithme vectoriel: Algorithme qui trouve un vecteur de sortie en appliquant un nb d’op´erations sur les vecteurs d’entr´ee,
ind´ependant de la longueur des vecteurs.
Mot machine: Vecteur binaire de 16, 32, 64 bits 0110001101001110
Op´erations unitaires sur les mots machine: x∨y,x∧y,¬x,x << a (d´eplacement ver la gauche),x >> a(d´eplacement vers la droite).
Recherche avec mismatchs - Algorithme Shift-Add:
(Baeza-Yates-Gonnet, 1992)
Recherche deP dansT avec au pluskmismatch.
Pour toute pos. j deT, vecteurEj de taillemtel queEj[i]
contient le nombre d’erreurs entreP[1..i] etT[j−i+ 1..j].
Occurrence de P finissant `a la positionj ssiEj[m]≤k.
Phase de pr´etraitement: Pour touta∈Σ, calculer le vecteurSa:
Pour touti, 1≤i≤m, Sa[i] =
0 sia=pi
1 sinon Alors,Ej+1[i] =Ej[i−1] + Stj+1[i]
a b
a b b a c a b b a b b a a
a b d a b b a b b
5 6
T:
E[5]: 2 4 2 0 1
a b a b b a b b a a
4 2 0 1 0 +1 1 0 0 1
5 3 0 1 1 E[6]:
a b a b b a b b a
a b
b a c a
0 0 1 1 1
S
a b d a b b a b b
5 6
T:
4 2 0 1 0
5 6
T:
0
a b d a b b a b b 4 2 0 1
b
P:
b: Nombre de bits n´ecessaires pour repr´esenter chaque ´etat individuel.
SiEj etSa cod´es chacun sur un mot machine:
Ej+1 = (Ej << b) + Stj+1
Valeurs possibles deEj[i]: 1,· · ·, m=⇒b=⌈log2(m+ 1)⌉
En fait, il suffit de repr´esenter les valeurs de 1 `ak+ 1
=⇒b=⌈log2(k+ 1)⌉+ 1
Un vecteur suppl´ementaireRj pour les “retenues” des additions est n´ecessaire.
SoitM le vecteur dem.bbits: 2b2b · · ·2b.
A chaque position` j dansT, les vecteursEj+1etRj+1sont calcul´es
`
a partir deEj etRj de la fa¸con suivante:
• Ej+1= (Ej << b) +Stj+1;
• I =Ej+1 ∧ M;
• Ej+1=Ej+1 ∧ ¬I;
• Rj+1= (Rj << b)∨ I
Exemple:
Σ ={a, b, c, d},P =abbacetk= 1.
Alorsb=⌈log2(2)⌉+ 1 = 2. TableS:
x a b c d
Sx 10110 11001 01111 11111
Etats successifs lors de la recherche de´ P dans le texte T =abdabbabbac:
T a b d a b b a b b a c
Ej 10110 10101 10101 11100 00001 11011 00000 11001 01011 00000 01111 Rj 22220 22200 22020 20220 22200 22000 20220 02200 22000 20220 02200
* *
Complexit´e:
|Σ|=c.
O(⌈mbω ⌉): temps n´ecessaire pour effectuer un nombre constant d’op´erations sur un ´etat de longueurmbrepr´esent´e sur un mot machine de longueurω.
• Calcul deS: tempsO ⌈mbω ⌉(m+c)
et espace O(⌈mbω ⌉c).
• Phase de recherche: temps dans le pire des cas et en moyenne enO(⌈mbω ⌉n)
Lorsquemb≤ω, complexit´e totale en temps enO(n+m+c)et complexit´e en espace enO(c)
Lorsque le nombre de mots machine utilis´e n’est pas trop grand, Shift-Add reste efficace en pratique.
Algorithme Shift-Or pour la recherche exacte:
Pour touti, 1≤i≤m, Ej[i] =
0 siP[1 :i] =T[j−i+ 1 :j]
1 sinon
Alors: Ej+1= (Ej << b) ∨ Stj+1
Sim≤w (32 ou 63), complexit´eO(n) en tempsetO(1) en espace.
Algorithme Shift-And pour la recherche avec erreurs:
Utilis´e dans le programmeagrepde UNIX.
Phase de pr´etraitement: Pour touta∈Σ, calculerCa: inverse (voir Hirschberg) du vecteur caract´eristique deadansP.
Exemple: SiP=abbac, alorsCa= 01001,Cb= 00110,Cc= 10000 et Cd= 00000.
Phase de recherche: Utilisek+ 1 vecteursEj0, E1j,· · ·Ekj:
Pour touti, Ejd[i] =
1 siP[1 :i] =T[j−i+ 1 :j] `aderreurs pr`es 0 sinon
Exemple:SiT=abcbcabbaetP=abbac, alorsE1
5= 00001 etE2
5= 10111
Initialisation: Pour toutd,Ed0= 0m−d1d
Pour queP[1..i] s’aligne avecT[j−i+ 2..j+ 1] `aderreurs pr`es, 4 cas possibles:
j−i+2
i 1 i−1
j+1
m j
T:
P:
• P[1..i−1] s’aligne avecT[j−i+ 2..j] avec au plusderreurs, et Pi=Tj+1−→Ej+1d =Ejd << 1 ∧ CTj+1
• P[1..i−1] s’aligne avecT[j−i+ 2..j] avec au plusd−1 erreurs (cas d’un match ou d’un mismatch)−→Ej+1d =Ejd−1 << 1
• Suppression dePi: P[1..i−1] s’aligne avecT[j−i+ 2..j+ 1]
avec au plusd−1 erreurs−→Ej+1d =Ej+1d−1 << 1
• Insertion deTj+1: P[1..i] s’aligne avecT[j−i+ 2..j] avec au plusd−1 erreurs−→Ej+1d =Ejd−1
Et donc, pour toutd >0:
Ej+1d = Edj << 1
∧ Ctj+1
∨ Ed−j 1 << 1
∨ Ej+1d−1 << 1
∨ Ejd−1
= Edj << 1
∧ CTj+1
∨
Ed−j 1 ∨ Ej+1d−1
<< 1
∨ Ejd−1
Pour d= 0:
Ej+10 = Ej0 << 1
∧ CTj+1
Complexit´e: La phase de recherche prend un temps enO(⌈mω⌉kn) Lorsquem≤ω, temps total de Shift-And enO(kn+m+c)et complexit´e en espace enO(c).
Exemple:
On rechercheannualdans le texteannealing`ak= 2 erreurs pr`es.
Au d´epart: E0= 000000,E1= 000001,E2= 000011.
E6 0 0 0 0 0 0 0 0 0 0 1 1 : 1
E6 1
E6 2: 1 0 0 1 1 1
P:
a n n u a l a n n u a n n u a a n n a a n T: a n n e a l i n g
6 7
:
P:
a n n u a n n u a a n n a a n
T: 6 7
1 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 0
a n n e a l i n g
n n u l a
a 0
0 0 0 0 0 Si E0
7=(000000 << 1) & 000000 = 000000 E1
7=((100011 << 1) & 000000) | (000000 << 1) | (000000 << 1)
| 000000 = 000001
E2
7=((100111 << 1) & 000000) | (100011 << 1) | (000001 << 1)