CSI2510 Structures de données et lgorithmes Recherche des motifs Chînes de crctères (string) Exemples de chînes (ou séquences) de crctères: Progrmme Jv HML document séquence DNA Imge numérique Un lphbet S est l ensemble des crctères utilisés dns les mots d un texte; Exemple d lphbets: ASCII Unicode {0, 1} {A, C, G, } 1 2 Recherche de motif Recherche de motif : Brute force Soit P une séquences de crctères de tille m Une sous- séquence P[i.. j] de P est composée pr les crctères entre i et j Un préfixe de P est une sous- séquence de type P[0.. i] Un suffixe de P est une sous- séquence de type P[i..m - 1] Étnt donné deux séquences (texte) et P (motif), le problème de recherche du motif est de trouver une sousséquences de égle à P Applictions: Éditeurs de texte Moteurs de recherche Recherche biologique b c c c L lgorithme de recherche de motif brute force compre le motif P vec le texte pour chque déclge de P reltif à, jusqu à ce que: Une correspondnce est trouvée ou on essyé toutes les possibilités b c c c c c c 3 4 1
Algorithme exhustif Force brute Algorithm BruteForceMtch(, P) Input text of size n nd pttern P of size m Output strting index of substring of equl to P or 1 if no such substring exists for i 0 to n m { test shift i of the pttern } while ( j < m && [i + j] = P[j]) if j = m return i {mtch t i} return -1 {no mtch nywhere} emps d execution: O(nm) Exemples du pire cs: = h et P = h Il pourrit se présenter en imges et en séquences ADN Rre dns les lngues nturelles Alphbet de tille moyenne et motif long L lgorithme de recherche des motifs de Boyer-Moore est bsé sur deux heuristiques: Heuristique Looking-glss: Comprer P vec une sous-séquence de en commençnt pr l fin de P (jusqu u premier crctère) Heuristique chrcter-jump: Qund un mismtch rrive à[i] = c (vec P[j]) Si P contient c, décler P pour ligner l dernière occurrence (l plus à droite) de c en P vec [i] Si P ne contient ps c, décler P complètement près [i] 5 6 Heuristique chrcter-jump: Heuristique looking-glss: 4 3 2 1 x x b Si P contient c, décler P pour ligner l dernière occurrence (l plus à droite) de c en P vec [i] 7 8 2
Heuristique chrcter-jump: Si P contient c, shift P pour ligner l dernière occurrence (l plus à droite) de c en P vec [i] Heuristique chrcter-jump: Si P ne contient ps c, décler P pour ligner P[0] vec [i + 1] x x b x x x b Si c est à l fin de P (prmi les crctères déjà vérifiés) se déplcer d une seule unité (voir exemple plus trd) 9 10 Heuristique chrcter-jump : Si P ne contient ps c, décler P pour ligner P[0] vec [i + 1] x x x b p t t e r n m t c h i n g l g o P 1 11 12 3
p t t e r n m t c h i n g l g o p t t e r n m t c h i n g l g o P 2 P 3 13 14 p t t e r n m t c h i n g l g o p t t e r n m t c h i n g l g o P 4 P 5 15 16 4
p t t e r n m t c h i n g l g o P 6 p t t e r n m t c h i n g l g o 7 P 11 10 9 8 17 18 Algorithm BMMtch(, P) Input: ext with n chrcters, pttern P with m chrcters Output: Strting index first substring of mtching P, or indiction there is no mtch // lst(c)=-1 si P ne contient ps c i m 1 j m 1 repet if [i] = P[j] if j = 0 return i { mtch! } i i 1 j j 1 {mismtch => jump!} i i + m min(j, 1 + lst([i])) j m 1 until i > n 1 return here is no mtch. Cs 1: j 1 + l....... i j Cs 2: 1 + l j.... b j l m j.... b............ i... b. l = j lst m (1 + l )... b. 1 + l 19 b c b d c b c b b b 1 b c b 4 3 2 13 12 11 10 9 8 b c b b c b 5 7 b c b b c b 6 b c b 20 5
: Complexité : Complexité Grder un tbleu de tille (lphbet). Pour chque entrée mémoriser l dernière occurrence en P de l lettre correspondnte. Construire cette fonction coûté O(m + ) P 0 2 1-1 b c d lst([i]) f c b c e r l m s c b b b m m m o r f f h k 1 c b h m O(m + ) i i + m min(j, 1 + lst([i])) j m 1 { jump!} L prtie de recherche: O(mn) u pire des cs comme brute-force 21 22 : Complexité Le temps d exec. de l lgorithme Boyer-Moore est O(nm + ) u pires des cs Exemple du pire cs : = P = b Le pire de cs peut rriver dns les imges et les séquences ADN; il est rre dns le texte; Boyer- Moore beucoup plus vite que l lgorithme brute force pour les textes 6 5 4 3 2 1 b 12 11 10 9 8 7 b 18 17 16 15 14 13 b 24 23 22 21 20 19 b L lgorithme Knuth-Morris-Prtt compre le motif vec le texte de-guche--droite, mis le déclge est choisi de fçon plus intelligente que dns l lgorithme brute force Qund il y un mismtch quel est le déclge mximl que l on puisse fire pour éviter les comprisons redondntes? Réponse: Aligner le plus long préfixe de P[0..j] qui est un suffixe de P[1..j] 23 24 6
Le plus long préfixe de P[0..j] qui est un suffixe de P[1..j] Ex: j=4 ---- > b b b Ex: j=5 ---- > b b b.. b b x..... b b Ex: j=2 ---- > b b Ex: j=1 ---- > none b b Je dois trouver le préfixe (ussi long que possible) qui s pprie vec un suffixe de l chine en hut mis ces deux chines sont identiques! 25 26 Déclge tel que le préfixe coïncide vec le suffixe.. b b x..... b b L lgorithme Knuth-Morris-Prtt clcule en vnce les préfixes du motif qui coïncident vec ses suffixes L filure function F(j) est définie comme l tille du plus long préfixe de P[0..j] qui est ussi un suffixe de P[1..j] b b j 0 1 2 3 4 5 P[j] b b F(j) 0 0 1 1 2 3 Ps besoin de répéter ces comprisons Recommencer à comprer ici b b j=2 ---- > b b j=3 ---- > b b j=4 ---- > b b b 27 j=5 ---- > b 28 7
L lgorithme Knuth-Morris-Prtt modifie l lgorithme de brute force de mnière que si le mismtch rrive à (P[j] [i]) on échnge j pr F(j - 1) et i (l position dns ) reste l même (ou si j =0, i est incrémentée de 1) j 0 1 2 3 4 5 P[j] b b F(j) 0 0 1 1 2 3.. b b x..... b b j b b F(j 1) L filure function peut être représentée pr un tbleu qui peut être clculé en un temps O(m) A chque itértion de l boucle while : i est incrémenté de un, OU L quntité de déclge i - j est incrémentée de u moins un (observez que F(j - 1) < j) Donc, il n y ps plus que 2n itértions de l boucle while Donc, l lgorithme KMP un temps optiml de O(m + n) Algorithm KMPMtch(, P) F filurefunction(p) i 0 while i < n if [i] = P[j] if j = m 1 return i j { mtch } if j > 0 return 1 { no mtch } 29 30 L filure function peut être représentée pr un tbleu qui peut être clculé en temps O(m) L construction est similire à celle de l lgorithme KMP A chque itértion de l boucle i ugmente de un, OU l quntité de déclge i - j ugmente de u moins un (observez que F(j - 1) < j) Donc il n y ps plus que 2m itértions de l boucle while Algorithm filurefunction(p) {we hve mtched j + 1 chrs} if j > 0 then {use filure function to shift P} F[i] 0 { no mtch } b b F(i) 0 0 Algorithm filurefunction(p) {we hve mtched j + 1 chrs} if j > 0 then {use filure function to shift P} F[i] 0 { no mtch } 31 32 8
b b F(i) 0 0 1 {on mtché 1 cr.} Algorithm filurefunction(p) {we hve mtched j + 1 chrs} if j > 0 then {use filure function to shift P} F[i] 0 { no mtch } b b F(i) 0 0 1 Algorithm filurefunction(p) {we hve mtched j + 1 chrs} if j > 0 then {use filure function to shift P} F[i] 0 { no mtch } Il n y ps de mtch de 2 cr Il fut verifier s il y un mtch vec 1 cr. 33 34 b b F(i) 0 0 1 Algorithm filurefunction(p) {we hve mtched j + 1 chrs} if j > 0 then {use filure function to shift P} F[i] 0 { no mtch } b b F(i) 0 0 1 1 Algorithm filurefunction(p) {we hve mtched j + 1 chrs} if j > 0 then {use filure function to shift P} F[i] 0 { no mtch } 35 36 9
b b F(i) 0 0 1 1 2 Algorithm filurefunction(p) {we hve mtched j + 1 chrs} if j > 0 then {use filure function to shift P} F[i] 0 { no mtch } b b F(i) 0 0 1 1 2 3 Algorithm filurefunction(p) {we hve mtched j + 1 chrs} if j > 0 then {use filure function to shift P} F[i] 0 { no mtch } On vit un mtch de 1 cr., mintennt de 2! On vit un mtch de 2 cr., mintennt de 3! 37 38 Exemple b c b c c b c b b b 1 2 3 4 5 6 b c b 7 b c b 8 9 10 11 12 b c b 13 j 0 1 2 3 4 5 b c b 14 15 16 17 18 19 P[j] b c b b c b F(j) 0 0 1 0 1 2 39 10