nsi:terminales:boyer_moore
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| nsi:terminales:boyer_moore [2021/09/11 19:59] – créée goupillwiki | nsi:terminales:boyer_moore [2023/05/08 21:26] (Version actuelle) – [Fonctions intermédiaires] goupillwiki | ||
|---|---|---|---|
| Ligne 47: | Ligne 47: | ||
| </ | </ | ||
| - | Ici , '' | + | Ici , '' |
| - | < | + | < |
| + | - Combien faut-il de tests dans le pire des cas ?\\ //Le pire des cas est le cas où '' | ||
| + | - Implémenter cette recherche naïve dans une fonction '' | ||
| + | </ | ||
| ===== Amélioration 1 ===== | ===== Amélioration 1 ===== | ||
| Ligne 86: | Ligne 89: | ||
| Voyons la nouvelle position : Maintenant, le T final de '' | Voyons la nouvelle position : Maintenant, le T final de '' | ||
| - | </code lang-none> | + | <code lang-none> |
| CAAGCGCACA[A]GACGCGGCAGACCTTCGTTATAGGCGATGATTTCGAACCTACTAGTGGGTCTCTTAGGCCGAGCGGT | CAAGCGCACA[A]GACGCGGCAGACCTTCGTTATAGGCGATGATTTCGAACCTACTAGTGGGTCTCTTAGGCCGAGCGGT | ||
| | | ||
| Ligne 98: | Ligne 101: | ||
| Il faut produire une variable qui donne la première position de tous les caractères de '' | Il faut produire une variable qui donne la première position de tous les caractères de '' | ||
| - | <WRAP box>**À faire :** Faites l' | + | <WRAP box>**À faire :** |
| + | - Écrivez une fonction '' | ||
| + | >>> | ||
| + | 4 | ||
| + | >>> | ||
| + | 0 | ||
| + | >>> | ||
| + | 1 | ||
| + | </ | ||
| + | - Faites l' | ||
| + | >>> | ||
| + | {" | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== Algorithme avec l' | ||
| Je résume l' | Je résume l' | ||
| <code lang-none> | <code lang-none> | ||
| + | Soit L la longueur de l' | ||
| Analyser aiguille selon fonction précédente -> rangs | Analyser aiguille selon fonction précédente -> rangs | ||
| régler le décalage à 0 | régler le décalage à 0 | ||
| A = dernier caractère de aiguille | A = dernier caractère de aiguille | ||
| TANT QUE le décalage n'est pas trop grand FAIRE | TANT QUE le décalage n'est pas trop grand FAIRE | ||
| - | | + | |
| - | SI A == B ALORS | + | SI n == taille |
| - | POUR CHAQUE caractère | + | RENVOYER |
| - | le comparer avec son vis à vis dans foin | + | SINON SI n == 0 ALORS |
| - | SI différents | + | # C' |
| - | | + | B = caractère de foin en vis à vis du dernier de aiguille |
| - | interrompre la boucle | + | SI B DANS les clés de rangs ALORS |
| - | FIN | + | augmenter |
| - | | + | |
| - | FIN | + | |
| - | SINON | + | |
| - | # c' | + | |
| - | | + | |
| - | augmenter décalage de la valeur de rangs correspondant à B | + | |
| SINON | SINON | ||
| - | augmenter décalage de la longueur de l' | + | augmenter |
| FIN | FIN | ||
| + | SINON | ||
| + | # nous améliorerons ce cas plus tard | ||
| + | augmenter le décalage de 1 | ||
| FIN | FIN | ||
| FIN | FIN | ||
| # fini et pas trouvé... | # fini et pas trouvé... | ||
| - | RENVOYER -1 # par exemple, ou False, ou None... | + | RENVOYER -1 |
| </ | </ | ||
| - | <WRAP box>**À faire :** appliquez | + | <WRAP box>**À faire :** |
| - | + | - Appliquez | |
| - | //Pour faciliter le travail, vous pouvez faire un copier-coller dans un bon éditeur comme Sublime Text ou Notepad++.// | + | |
| - | + | ||
| - | <code lang-none> | + | |
| CAAGCGCACAAGACGCGGCAGACCTTCGTTATAGGCGATGATTTCGAACCTACTAGTGGGTCTCTTAGGCCGAGCGGT | CAAGCGCACAAGACGCGGCAGACCTTCGTTATAGGCGATGATTTCGAACCTACTAGTGGGTCTCTTAGGCCGAGCGGT | ||
| GTCTCT | GTCTCT | ||
| </ | </ | ||
| + | - Faites une implémentation en Python. | ||
| </ | </ | ||
| - | < | + | < |
| - | + | Pour la séquence | |
| - | ==== Faire un peu mieux ==== | + | <code lang-none> |
| - | + | SI B DANS les clés de rangs ALORS | |
| - | Dans l' | + | |
| - | + | SINON | |
| - | Il faudrait alors convenir dès le début | + | augmenter le décalage de L |
| - | + | FIN | |
| - | Une autre possibilité serait d' | + | </ |
| + | On peut grandement simplifier | ||
| + | <code python> | ||
| + | rangs.get(B, L) | ||
| + | </ | ||
| <code python> | <code python> | ||
| - | r = rangs(aiguille) | + | >>> |
| - | n = len(aiguille) | + | >>> |
| - | ... | + | 1 |
| - | k = r.get(B) | + | >>> |
| - | if k == None: # B pas présent dans r | + | KeyError ' |
| - | r[B] = n # on l' | + | >>> |
| - | k = n | + | 1 |
| + | >>> | ||
| + | 6 | ||
| </ | </ | ||
| + | </ | ||
| ===== Amélioration 2 ===== | ===== Amélioration 2 ===== | ||
| - | L' | + | L' |
| Prenons le cas suivant : | Prenons le cas suivant : | ||
| Ligne 168: | Ligne 189: | ||
| <code lang-none> | <code lang-none> | ||
| abrrtsdfdfsggtbdu[bra]yuioabrauioikjd | abrrtsdfdfsggtbdu[bra]yuioabrauioikjd | ||
| - | abracadobrada[bra] -> Les 3 premiers | + | abracadobrada[bra] -> Les 3 premières |
| </ | </ | ||
| Ligne 227: | Ligne 248: | ||
| Ce faisant on définit une relation : '' | Ce faisant on définit une relation : '' | ||
| - | On peut le noter dans un tableau '' | + | On peut le noter dans un tableau '' |
| - | === Remarques === | + | <WRAP tip> |
| + | Le premier '' | ||
| + | </ | ||
| - | * Le premier nombre sera toujours '' | + | ==== Fonctions intermédiaires ==== |
| - | * Si aucune concordance n'est trouvée, la valeur par défaut est '' | + | |
| - | ==== Fonction intermédiaire ==== | + | === Calcul de décalage |
| - | On souhaite implémenter une fonction '' | + | On souhaite implémenter une fonction '' |
| - | Considérant un mot '' | + | Considérant un mot '' |
| - | Soit '' | + | Soit '' |
| <code lang-none> | <code lang-none> | ||
| Ligne 260: | Ligne 282: | ||
| <code lang-none> | <code lang-none> | ||
| # on présuppose que 1 <= k < len(aiguille) | # on présuppose que 1 <= k < len(aiguille) | ||
| - | n = len(aiguille) | + | L = len(aiguille) |
| d = 1 # décalage vers la gauche qu'il faut donner à suffixe | d = 1 # décalage vers la gauche qu'il faut donner à suffixe | ||
| # pour trouver une concordance | # pour trouver une concordance | ||
| suffixe = k dernières lettres de aiguille | suffixe = k dernières lettres de aiguille | ||
| c = caractère avant suffixe | c = caractère avant suffixe | ||
| - | TANT QUE d < n: # d = n est cas pire si pas concordance | + | TANT QUE d < L FAIRE |
| m = rang du caractère face au début du suffixe | m = rang du caractère face au début du suffixe | ||
| + | en tenant compte du décalage d vers la gauche | ||
| SI m > 0 ALORS | SI m > 0 ALORS | ||
| caractère en vis à vis de c = caractère aiguille en m - 1 | caractère en vis à vis de c = caractère aiguille en m - 1 | ||
| Ligne 279: | Ligne 302: | ||
| FIN | FIN | ||
| FIN | FIN | ||
| - | RENVOYER | + | RENVOYER |
| </ | </ | ||
| - | <WRAP box>**À faire :** Faites l' | + | <WRAP box>**À faire :** Faites l' |
| - | ==== Constitution d'un tableau | + | === Constitution d'un tableau === |
| - | Le plus difficile est fait. On veut maintenant une fonction '' | + | Le plus difficile est fait. On veut maintenant une fonction '' |
| - | * '' | + | * '' |
| - | * '' | + | * '' |
| - | * '' | + | * '' |
| - | <WRAP box>**À faire :** Faites l' | + | <WRAP box>**À faire :** Faites l' |
| Ligne 298: | Ligne 321: | ||
| <code python> | <code python> | ||
| - | shifts('ELLE EST BELLE TA POUBELLE' | + | >>> |
| - | shifts(' | + | [0, 3, 25, 25, 22, 12, 22, ..., 22] |
| + | >>> | ||
| + | [0, 4, 6, 2, 6, 6, 6] | ||
| </ | </ | ||
| Ligne 305: | Ligne 330: | ||
| <code lang-none> | <code lang-none> | ||
| + | soit L la longueur de l' | ||
| Analyser aiguille selon fonction précédente -> rangs et shifts | Analyser aiguille selon fonction précédente -> rangs et shifts | ||
| régler le décalage à 0 | régler le décalage à 0 | ||
| A = dernier caractère de aiguille | A = dernier caractère de aiguille | ||
| TANT QUE le décalage n'est pas trop grand FAIRE | TANT QUE le décalage n'est pas trop grand FAIRE | ||
| - | | + | |
| - | SI A == B ALORS | + | SI n == taille de aiguille |
| - | | + | |
| - | | + | SINON SI n == 0 ALORS |
| - | TANT QUE corrects < n FAIRE | + | # C' |
| - | comparaison du caractère du caractère suivant avec son vis à vis | + | B = caractère de foin en vis à vis du dernier de aiguille |
| - | SI identiques ALORS | + | SI B DANS les clés de rangs ALORS |
| - | corrects augmente de 1 | + | augmenter |
| - | | + | |
| - | interrompre boucle TANT QUE | + | |
| - | FIN | + | |
| - | FIN | + | |
| - | | + | |
| - | renvoyer la valeur de décalage # (fini et trouvé !) | + | |
| - | FIN | + | |
| - | décalage augmente de shifts[corrects] | + | |
| - | SINON | + | |
| - | # c' | + | |
| - | SI B est dans aiguille | + | |
| - | augmenter décalage de la valeur de rangs correspondant à B | + | |
| SINON | SINON | ||
| - | augmenter décalage de la longueur de l' | + | augmenter |
| FIN | FIN | ||
| + | SINON | ||
| + | # voici l' | ||
| + | augmenter le décalage de shifts[n] | ||
| FIN | FIN | ||
| FIN | FIN | ||
| - | # pas trouvé... | + | # fini et pas trouvé... |
| - | renvoyer | + | RENVOYER |
| </ | </ | ||
| <WRAP box>**À faire :** Réalisez l' | <WRAP box>**À faire :** Réalisez l' | ||
nsi/terminales/boyer_moore.1631383143.txt.gz · Dernière modification : de goupillwiki
