680 likes | 790 Views
IFT3295 Démonstration. 28 septembre 2011 Shift-And (avec erreurs). Plan. Présentation en détail de l'algorithme Shift-And (avec erreurs) Présentation de PROSITE. Shift-And (avec erreurs). Wu et Manber (1992) Base du logiciel agrep de Unix
E N D
IFT3295Démonstration 28 septembre 2011 Shift-And (avec erreurs)
Plan • Présentation en détail de l'algorithme Shift-And (avec erreurs) • Présentation de PROSITE
Shift-And (avec erreurs) • Wu et Manber (1992) • Base du logiciel agrep de Unix • Recherche approximative d'un mot dans un texte • Permet les insertions, les délétions et les substitutions de caractères
Shift-And (avec erreurs) • Exemple : • Texte : aabaacaabacab • Mot : aabac (|mot| = m) • Alphabet : {a, b, c} • Pré-traitement : • Pour chaque caractère x de l'alphabet, on construit un tableau de bits Sx tel que Sx[pos] = 1 si motpos = x (pour 1 <= pos <= m)
Shift-And (avec erreurs) • Pré-traitement : • Pour chaque caractère x de l'alphabet, on construit un tableau de bits Sx tel que Sx[pos] = 1 si motpos = x (pour 1 <= pos <= m) a a b a c Mot : Sa Sb Sc
Shift-And (avec erreurs) • Soit k, le nombre d'erreurs que l'on veut permettre • On doit construire (k+1) tableaux de bits R de taille m * (n+1) (où n = |texte|) (quoique la plupart des colonnes pourront être oubliées) : • R0, R1, …, Rk
Shift-And (avec erreurs) • Les tableaux R doivent être construits dans l'ordre croissant du nombre d'erreurs • Regardons d'abord la construction de R0, qui est l'équivalent de Shift-Or (recherche exacte)
Shift-And (avec erreurs) • Au départ : R0
Shift-And (avec erreurs) • Objectif : trouver 1 sur la ligne m match R0
Shift-And (avec erreurs) 1 si R0j[i-1] = 1 et moti = textej+1 0 sinon R0j+1[i] = j j+1 R0 i-1 i
Shift-And (avec erreurs) 1 si R0j[i-1] = 1 et moti = textej+1 0 sinon R0j+1[i] = j j+1 R0 i-1 i
Shift-And (avec erreurs) 1 si R0j[i-1] = 1 et moti = textej+1 0 sinon R0j+1[i] = j j+1 R0 i-1 i
Shift-And (avec erreurs) 1 si R0j[i-1] = 1 et moti = textej+1 0 sinon R0j+1[i] = j j+1 R0 i-1 i
Shift-And (avec erreurs) 1 si R0j[i-1] = 1 et moti = textej+1 0 sinon R0j+1[i] = j j+1 R0 i-1 i
Shift-And (avec erreurs) 1 si R0j[i-1] = 1 et moti = textej+1 0 sinon R0j+1[i] = j j+1 R0 i-1 i
Shift-And (avec erreurs) 1 si R0j[i-1] = 1 et moti = textej+1 0 sinon R0j+1[i] = R0
Shift-And (avec erreurs) 1 si R0j[i-1] = 1 et moti = textej+1 0 sinon R0j+1[i] = R0
Shift-And (avec erreurs) • Qu'est-ce que ça représente? j j+1 R0 i-1 i
Shift-And (avec erreurs) • Qu'est-ce que ça représente? j j+1 R0 i-1 i
Shift-And (avec erreurs) • Qu'est-ce que ça représente? j j+1 R0 i-1 i
Shift-And (avec erreurs) • Qu'est-ce que ça représente? j j+1 R0 i-1 i
Shift-And (avec erreurs) • Qu'est-ce que ça représente? j j+1 R0 i-1 i
Shift-And (avec erreurs) • Qu'est-ce que ça représente? j j+1 R0 i-1 i
Shift-And (avec erreurs) • Cette transition peut être calculée bien plus efficacement • R0j+1 = Rshift[R0j] AND Sj+1 où Sj+1 est la table de pré-traitement du caractère qui est à la position j+1 dans le texte Sa Sb Sc
Shift-And (avec erreurs) • Rshift : • On décale les bits à droite d'une position, on élimine le dernier bit et on insère 1 à gauche Rshift[00000] = 10000 Rshift[10001] = 11000
Shift-And (avec erreurs) • R0j+1 = Rshift[R0j] AND Sj+1 Sa Sb Sc R0
Shift-And (avec erreurs) • R0j+1 = Rshift[R0j] AND Sj+1 Sa Sb Sc j j+1 R0
Shift-And (avec erreurs) • R0j+1 = Rshift[R0j] AND Sj+1 Sa Sb Sc j j+1 R0 0
Shift-And (avec erreurs) • R0j+1 = Rshift[R0j] AND Sj+1 Sa Sb Sc j j+1 R0
Shift-And (avec erreurs) • R0j+1 = Rshift[R0j] AND Sj+1 Sa Sb Sc j j+1 R0
Shift-And (avec erreurs) • R0j+1 = Rshift[R0j] AND Sj+1 Sa Sb Sc j j+1 R0
Shift-And (avec erreurs) • R0j+1 = Rshift[R0j] AND Sj+1 Sa Sb Sc j j+1 R0 0
Shift-And (avec erreurs) • R0j+1 = Rshift[R0j] AND Sj+1 Sa Sb Sc j j+1 R0
Shift-And (avec erreurs) • R0j+1 = Rshift[R0j] AND Sj+1 Sa Sb Sc j j+1 R0
Shift-And (avec erreurs) • R0j+1 = Rshift[R0j] AND Sj+1 Sa Sb Sc j j+1 R0
Shift-And (avec erreurs) • R0j+1 = Rshift[R0j] AND Sj+1 Sa Sb Sc j j+1 R0 0
Shift-And (avec erreurs) • R0j+1 = Rshift[R0j] AND Sj+1 Sa Sb Sc j j+1 R0
Shift-And (avec erreurs) • R0j+1 = Rshift[R0j] AND Sj+1 Sa Sb Sc j j+1 R0
Shift-And (avec erreurs) • R0j+1 = Rshift[R0j] AND Sj+1 Sa Sb Sc R0
Shift-And (avec erreurs) • Nous venons de voir la construction de R0, qui est l'équivalent de Shift-Or (recherche exacte) • Que fait-on pour R1, R2, …, Rk? • Trois types d'erreurs sont permises : insertions, délétions et substitutions
Shift-And (avec erreurs) • Insertion (1er cas) : j+1 a a b a a c a a b a c a b a a R0j+1[2] = 0 i = 2
Shift-And (avec erreurs) • Insertion (1er cas) : j+1 a a b a a c a a b a c a b a a b R0j+1[2] = 0 i = 2 R1j+1[2] = 1
Shift-And (avec erreurs) • Insertion (2e cas) : j+1 a a b a a c a a b a c a b a a R0j+1[2] = 0 i = 2
Shift-And (avec erreurs) • Insertion (2e cas) : j+1 a a b a a c a a b a c a b a b a R0j+1[2] = 0 i = 2 R1j+1[2] = 1
Shift-And (avec erreurs) • Délétion (1er cas) : j+1 a a b a a c a a b a c a b a b a a b R0j+1[5] = 0 i = 5
Shift-And (avec erreurs) • Délétion (1er cas) : j+1 a a b a a c a a b a c a b a b a a b R0j+1[5] = 0 i = 5 R1j+1[5] = 1
Shift-And (avec erreurs) • Délétion (2e cas) : j+1 a a b a a c a a b a c a b a b a a b c R0j+1[6] = 0 i = 6 R1j+1[6] = 1
Shift-And (avec erreurs) • Substitution (1er cas) : j+1 a a b a a c a a b a c a b a a b a c R0j+1[5] = 0 i = 5
Shift-And (avec erreurs) • Substitution (1er cas) : j+1 a a b a a c a a b a c a b a a b a c R0j+1[5] = 0 i = 5 R1j+1[5] = 1
Shift-And (avec erreurs) • Substitution (2e cas) : j+1 a a b a a c a a b a c a b a a b c a R0j+1[5] = 0 i = 5 R1j+1[5] = 1