Algorithme de correspondance de chaînes - Notes sur l'algorithme BF / RK / BM / KMP


I. Aperçu

Comme son nom l'indique, la correspondance de chaîne est l'opération consistant à trouver une correspondance avec la chaîne cible (chaîne de modèle) dans la chaîne principale.
Les algorithmes traditionnels de correspondance de chaînes peuvent être résumés en tant que recherche de préfixe, recherche de suffixe et recherche de sous-chaîne.

Cet article traite principalement des algorithmes courants tels que BF, RK, BM, KMP du processus de déduction et d'analyse des algorithmes.


Deux, algorithme BF

BF: BruteForce, l'algorithme utilise une manière simple et grossière de comparer la chaîne principale et la chaîne de modèle caractère par caractère.

2.1 Processus de déduction

Chaîne principale: GTTATAGCTGGTAGCGGCGAA
Chaîne de mode: GTAGCGGCG

  1. Au premier tour, la chaîne de modèle est comparée à la première sous-chaîne de longueur égale de la chaîne principale, et on constate que le 0ème caractère est cohérent, le premier caractère est cohérent et le second caractère est incohérent:
    Insérez la description de l'image ici

  2. La chaîne de modèle est déplacée d'un bit vers l'arrière et comparée à la deuxième sous-chaîne de longueur égale de la chaîne principale, on constate que le 0ème caractère est incohérent
    Insérez la description de l'image ici

  3. ... Et ainsi de suite, jusqu'au Nième tour:
    Insérez la description de l'image ici

  4. Lorsque le motif est déplacé vers une position appropriée et comparé caractère par caractère, lorsque chaque bit correspond, la comparaison se termine
    Insérez la description de l'image ici

2.2 Analyse de l'algorithme
Grâce au processus de déduction ci-dessus, nous savons que l'idée d'algorithme BF est relativement simple et claire, et qu'il peut encore être utilisé pour des chaînes relativement courtes ou utiliser des champs avec de faibles exigences d'efficacité. Dans le même temps, les lacunes de l'algorithme BF sont également plus évidentes, c'est-à-dire que l'efficacité est trop faible, chaque tour ne peut que déplacer la chaîne de modèle vers la droite, en fait, de nombreuses comparaisons inutiles ont été effectuées.

Donnez une châtaigne:
chaîne principale: aaaaaaaaaaaaaaaaaaaab
chaîne de motif: aaab

Dans ce cas, à chaque tour de correspondance de caractères, les trois premiers caractères a de la chaîne de modèle correspondent aux caractères de la chaîne principale, et le dernier caractère b de la chaîne de modèle est vérifié jusqu'à ce que l'incompatibilité soit trouvée: en
Insérez la description de l'image ici
supposant que la chaîne principale length est m, et la longueur de la chaîne de modèle est n. Dans ce cas extrême, la pire complexité temporelle de l'algorithme BF est O (mn).


Trois, algorithme RK

RK: Le nom complet est Rabin-Karp, basé sur une amélioration de l'algorithme BF, du nom des deux inventeurs de l'algorithme, Rabin et Karp. Il est implémenté en comparant les valeurs de hachage de deux ensembles de chaînes.

Que signifie comparer les valeurs de hachage?
Les amis qui ont utilisé des tables de hachage savent que chaque chaîne peut être convertie en un nombre entier grâce à un certain algorithme de hachage. Ce nombre entier est hashcode: hashcode = hash (string).
Évidemment, par rapport à la comparaison de deux chaînes une par une, il est beaucoup plus facile de comparer simplement le hashcode de deux chaînes.
Insérez la description de l'image ici

3.1 Processus de déduction

Chaîne principale: chaîne de
modèle abcefgh: bce


  • Il y a deux façons de générer un hashcode pour la chaîne de modèle :
    1) Méthode 1:
    Ajouter par bit C'est la méthode la plus simple, vous pouvez considérer a comme 1, b comme 2, c comme 3 ... Puis tous les caractères de la chaîne sont comparés Add, et le résultat de l'addition est son hashcode, tel que bce = 2 + 3 + 5 = 10. Bien que cet algorithme soit simple, des conflits sont susceptibles de se produire. Par exemple, les codes de hachage de bce, bec et cbe sont identiques.

    2) Méthode 2: Convertir en un nombre de 26 bases
    Puisque la valeur de chaîne contient 26 lettres minuscules, chaque chaîne peut être calculée comme un nombre de 26 bases.
    bce = 2 * (26 ^ 2) + 3 * 26 + 5 = 1435. Cela présente l'avantage de réduire considérablement les conflits de hachage. L'inconvénient est que la quantité de calcul est importante et qu'il peut y avoir des cas au-delà de la plage entière. les résultats des calculs doivent exécuter modulo.

    Pour la commodité de la démonstration, nous utilisons l'algorithme de hashcode d'addition bit à bit, donc le hashcode de bce est 10.
    Insérez la description de l'image ici

  • Générez le hashcode de la première sous-chaîne de longueur égale dans la chaîne principale
    abb = 1 + 2 + 2 = 5
    Insérez la description de l'image ici
    Comparez deux hashcodes
    5! = 10, indiquant que la chaîne de modèle ne correspond pas à la première sous-chaîne, passez au cycle de comparaison suivant.

  • Générez le hashcode de la deuxième sous-chaîne de longueur égale dans la chaîne principale
    bbc = 2 + 2 + 3 = 7
    Insérez la description de l'image ici
    Comparez deux hashcodes, 7! = 10 signifie que la chaîne de modèle ne correspond pas à la deuxième sous-chaîne, passez au prochain cycle de comparaison.

  • Générez le hashcode de la troisième sous-chaîne de
    longueur égale bce = 2 + 3 + 5 = 10 pour
    Insérez la description de l'image ici
    comparer deux hashcodes, 10 == 10, les deux hashcodes sont égaux.
    En raison de la possibilité de conflits de hachage, une vérification supplémentaire est requise.

  • La comparaison des deux chaînes
    Hashcode caractère par caractère n'est qu'une vérification préliminaire, après quoi les deux chaînes doivent être comparées comme l'algorithme BF pour déterminer si les deux chaînes correspondent.
    Insérez la description de l'image ici
    Enfin, on conclut que la chaîne de modèle bce est une sous-chaîne de la chaîne principale abcefgh et que la première occurrence de l'indice est 2.

3.2 Analyse des algorithmes

  • La complexité temporelle de chaque hachage est O (n). Si toutes les sous-chaînes sont hachées, la complexité temporelle totale n'est-elle pas la même que BF, qui est O (mn)?
    Réponse: Le calcul du hachage des sous-chaînes n'est pas indépendant. À partir de la deuxième sous-chaîne, le hachage de chaque sous-chaîne peut être calculé par un simple calcul incrémental de la sous-chaîne précédente. Prenons un châtaigne: dans la
    Insérez la description de l'image ici
    figure ci-dessus, on sait que le hashcode de la sous-chaîne abcefg est 26, alors comment calculer le hashcode de la prochaine sous-chaîne bbcefgd?
    Insérez la description de l'image ici
    À ce stade, il n'est pas nécessaire de réaccumuler les caractères de la sous-chaîne, mais une méthode plus simple peut être utilisée. Parce que la nouvelle sous-chaîne a un a manquant à l'avant et un d supplémentaire à l'arrière, donc:
    new hashcode = old hashcode-1 + 4 = 26-1 + 4 = 29

    Le calcul de la sous-chaîne suivante bcefgde est le même:
    new hashcode = old hashcode-1 + 4 = 26-2 + 5 = 32

  • Complexité temporelle de l'
    algorithme L'algorithme RK calcule la complexité temporelle d' un hachage de sous-chaîne unique est O (n), mais comme le hachage de sous-chaîne suivant est un calcul incrémental, la complexité temporelle totale est toujours O (n).
    Par rapport à l'algorithme BF, l'algorithme RK utilise une méthode de comparaison de valeurs de hachage, éliminant de nombreuses comparaisons de caractères inutiles, de sorte que la complexité temporelle est grandement améliorée.

  • Inconvénients
    de l' algorithme RK Chaque fois qu'il y a une collision de hachage, l'algorithme RK doit comparer la sous-chaîne et la chaîne de motif caractère par caractère. S'il y a trop de conflits, l'algorithme RK dégénère en l'algorithme BF.


Quatre, algorithme BM

Le nom de l'algorithme BM vient de ses deux inventeurs, Bob Boyer et Stronger Moore.
L'algorithme BM utilise des «règles de caractères incorrects» et des «règles de suffixe correctes» pour déplacer la chaîne de motif autant que possible pendant chaque cycle de comparaison, réduisant ainsi de nombreuses comparaisons inutiles dans l'algorithme BF.

4.1 Processus de déduction

  1. Règle de caractère incorrect
    «Caractère incorrect» fait référence aux caractères qui ne correspondent pas dans la chaîne de modèle et la sous-chaîne.
    Exemples:
    Insérez la description de l'image ici
    1) Comme le montre la figure ci-dessus, lorsque la chaîne de modèle est comparée à la première sous-chaîne de longueur égale de la chaîne principale, la dernière chaîne T de la sous-chaîne est un mauvais caractère.

    Question: Pourquoi le mauvais caractère n'est-il pas le deuxième caractère T de la chaîne principale? Cet emplacement n'est-il pas le premier à être détecté?

    Réponse: La séquence de détection de l'algorithme BM est inversée et la détection commence du côté le plus à droite de la chaîne vers la gauche . Le but d'une telle séquence de détection est que lorsque le premier mauvais caractère est détecté, nous n'avons pas besoin de déplacer la chaîne de modèle petit à petit vers l'arrière et de la comparer. En effet, ce n'est que lorsque la position d'alignement de la chaîne de modèle et du caractère incorrect T est également le caractère T, les deux peuvent correspondre.

    2) Il n'est pas difficile de trouver que le premier caractère de la chaîne de motif est également T. De cette manière, vous pouvez effectuer un "décalage d'univers" sur la chaîne de motif, et connecter directement le caractère T dans la chaîne de motif avec le mauvais caractères de la chaîne principale, et procéder Un tour de comparaison.
    Insérez la description de l'image ici
    Plus la position du mauvais caractère est proche de la droite, plus la durée de décalage de la chaîne de motif au tour suivant sera longue et plus les temps de comparaison seront enregistrés. C'est l'avantage de l'algorithme BM de droite à gauche.

    3) Ensuite, continuez à comparer les caractères un par un et constatez que les GCG sur la droite sont tous cohérents, et le caractère A dans la chaîne principale est détecté comme un caractère incorrect:
    Insérez la description de l'image ici
    selon la méthode qui vient d'être utilisée, le deuxième bit du la chaîne de modèle est également A, donc le modèle Le caractère A de la chaîne est aligné avec le caractère incorrect de la chaîne principale, et le prochain tour de comparaison est effectué:
    Insérez la description de l'image ici
    4) Ensuite, continuez à comparer caractère par caractère de droite à gauche . Cette fois, on constate que tous les caractères correspondent. La comparaison est terminée:
    Insérez la description de l'image ici
    5) "Explication: Lorsque le caractère incorrect n'existe pas dans la chaîne de modèle, déplacez directement la chaîne de modèle vers le bit suivant du caractère incorrect dans chaîne.
    Insérez la description de l'image ici

  2. Bonne règle de suffixe
    «Bon suffixe» fait référence au suffixe que vous souhaitez faire correspondre dans la chaîne et la sous-chaîne de modèle.

    Exemples:
    Insérez la description de l'image ici
    1) Le premier tour de comparaison a révélé que la chaîne principale et la chaîne de modèle ont un suffixe commun "GCG", qui est le soi-disant "bon suffixe".
    Insérez la description de l'image ici

    Si d'autres parties de la chaîne de modèle contiennent également le même segment que «GCG», vous pouvez déplacer la chaîne de modèle pour aligner ce segment avec le bon suffixe et effectuer le prochain cycle de comparaison.

    2) Déplacer
    Insérez la description de l'image ici

    De toute évidence, dans cet exemple, l'adoption d'une bonne règle de suffixe peut faire reculer la chaîne de modèle de plus de bits, ce qui économise plus de comparaisons inutiles.

    3) S'il n'y a pas d'autres segments avec le même suffixe dans la chaîne de modèle, que dois-je faire? Est-il possible de déplacer la chaîne de modèle directement après le suffixe?
    Insérez la description de l'image ici
    la réponse est négative.
    Nous ne pouvons pas déplacer directement la chaîne de modèle à l'arrière du bon suffixe. Nous devons d'abord juger d'un cas particulier, si le préfixe de la chaîne de modèle correspond au suffixe du bon suffixe, afin de ne pas déplacer la tête trop loin .
    Insérez la description de l'image ici

4.2 Analyse des algorithmes
Quand utiliser de mauvaises règles de caractères et quand utiliser de bonnes règles de suffixe?

Réponse: Après chaque cycle de comparaison de caractères, la distance de décalage correspondante peut être calculée selon les règles des mauvais caractères et des bons suffixes. Quelle que soit la distance la plus longue, décalez la chaîne du motif à la longueur correspondante.


Cinq, algorithme KMP

Le nom de l'algorithme KMP vient des trois informaticiens qui ont inventé cet algorithme: DEKnuth, JHMorris et VRPratt. Le but de l'algorithme est de déplacer la chaîne de motif autant de bits que possible à chaque tour, réduisant ainsi les comparaisons de caractères indifférentes. L'algorithme KMP met l'accent sur les "préfixes correspondants".

5.1 Le processus de déduction
Insérez la description de l'image ici
L '"ouverture" de l'algorithme KMP et de l'algorithme BF est la même, il en va de même pour aligner les premiers chiffres de la chaîne principale et de la chaîne de motif, et comparer caractère par caractère de gauche à droite.

  • Le premier tour: la chaîne de modèle est comparée à la première sous-chaîne de longueur égale de la chaîne principale. On constate que les 5 premiers caractères correspondent et que le 6e caractère ne correspond pas, ce qui est un "mauvais caractère":
    Insérez la description de l'image ici
    comment procéder efficacement utiliser le préfixe correspondant "GTGTG" Quoi? D'après l'observation ci-dessus, nous pouvons constater que dans le préfixe "GTGTG", les trois derniers caractères "GTG" et les trois premiers caractères "GTG" sont les mêmes.
    Insérez la description de l'image ici
    Dans le prochain tour de comparaison, ce n'est qu'en alignant ces deux fragments identiques qu'il peut y avoir une correspondance. Ces deux fragments de chaîne sont appelés respectivement la plus longue sous-chaîne de suffixe correspondante et la plus longue sous-chaîne de préfixe correspondant .

  • Au deuxième tour, déplacez directement la chaîne de motif de deux positions, alignez les deux "GTG" et continuez à comparer à partir du mauvais caractère A de la chaîne principale tout à l'heure:
    Insérez la description de l'image ici
    évidemment, le caractère A de la chaîne principale est toujours un mauvais caractère. Le préfixe correspondant est raccourci en GTG:
    Insérez la description de l'image ici
    selon le premier tour de réflexion, redéfinissez la plus longue sous-chaîne de suffixe correspondante et la plus longue sous-chaîne de préfixe correspondante:
    Insérez la description de l'image ici

  • Le troisième tour: déplacez à nouveau la chaîne de motif de deux positions, alignez les deux G et continuez à comparer à partir du mauvais caractère A de la chaîne principale tout à l'heure: ce qui
    Insérez la description de l'image ici
    précède est l'idée générale de l'algorithme KMP: trouvez le la plupart dans les préfixes correspondants La longue sous-chaîne de suffixe matchable et la plus longue sous-chaîne de préfixe matchable sont directement alignées dans le tour suivant, de manière à réaliser le mouvement rapide de la chaîne de motif.

5.2 Analyse de l'algorithme

  • Comment trouver la "plus longue sous-chaîne de suffixe correspondante" et "la plus longue sous-chaîne de préfixe correspondant" d'un préfixe de chaîne? Devons-nous traverser à nouveau à chaque tour?

    Réponse: Il n'est pas nécessaire de parcourir à chaque fois, vous pouvez le mettre en cache dans une collection à l'avance, puis accéder à la collection pour le récupérer lorsque vous l'utilisez. Cet ensemble est appelé le tableau suivant. Comment générer le tableau suivant est la plus grande difficulté de l'algorithme KMP.

  • Tableau
    suivant Le tableau suivant est un tableau d'entiers unidimensionnel. L'indice du tableau représente "la position suivante du préfixe correspondant" et la valeur de l'élément est "la position suivante de la sous-chaîne de préfixe correspondante la plus longue".

  • Retour en
    arrière Le retour en arrière est relatif à la chaîne de modèle. La quantité de retour arrière dépend du nombre de préfixes et de suffixes partagés par la chaîne de modèle.
    Insérez la description de l'image ici
    Insérez la description de l'image ici


Réimprimé: https://blog.csdn.net/bjweimengshu/article/details/104528964?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_sommenpai2-1.control&depth_1-utm_sommenpai_distribine_pcontrol&depth_1-utm_source=distribine_pc_pcontrol&depth_1-utm_source=distribine_pc_source_pc -1.contrôle

Je suppose que tu aimes

Origine blog.csdn.net/locahuang/article/details/110186766
conseillé
Classement