TL; DR: Un type de distance d'édition légèrement plus restrictif, dans lequel nous pouvons uniquement insérer et supprimer des caractères individuels, peut être calculé en temps linéithmique lorsque les deux (ou même une seule) des chaînes ont des caractères uniques. Cela donne des limites supérieures et inférieures utiles sur la distance d'édition de Levenshtein.
Insérer / supprimer la distance d'édition et les sous-séquences communes les plus longues
La distance d'édition de Levenshtein autorise les insertions, les suppressions et les substitutions à un seul caractère, en affectant à chacune un coût de 1. Si nous nous limitons aux insertions et aux suppressions, nous obtenons une mesure de distance similaire qui fait maintenant que les substitutions ont un coût de 2 (puisque toute substitution peut être imité à l'aide d'une insertion et d'une suppression). Je ne connais pas de nom standard pour ce type de distance d'édition plus restrictif, donc je l'appellerai "insérer / supprimer la distance d'édition". Il correspond étroitement au problème de sous- séquence commune le plus long (LCS) , dans lequel on nous donne deux chaînes, de longueur et , respectivement, et nous voulons connaître la longueur de la sous-séquence la plus longue qui apparaît dans les deux. Si deux chaînes ont LCSmnL, puis ils ont insérer / supprimer la distance d'éditionn+m−2L : la façon la plus simple de voir cela est d'aligner les chaînes de sorte que les caractères dans le LCS apparaissent empilés les uns sur les autres, tandis que les caractères qui ne sont pas dans le LCS apparaissent en face d'un -
espace personnage. Il apparaîtra alors que nous pouvons éditer la première chaîne dans la seconde en faisant une insertion là où il y en a -
dans la rangée du haut, et une suppression partout où il y en a -
dans la rangée du bas. Par exemple:
-C-IRC-LE
T-RI-CKLE
Ici, le LCS de CIRCLE
et TRICKLE
, ICLE
a une longueur de 4, et la distance d'édition est en effet .6+7−2∗4=5
Sous-séquences croissantes les plus longues
La raison de ce détour est qu'il existe un moyen très efficace de calculer le LCS (et donc la distance de montage d'insertion / suppression) lorsqu'au moins une des séquences ne contient que des caractères distincts: dans ce cas, le problème LCS peut être transformé en le problème de trouver une sous- séquence croissante la plus longue , qui peut être résolue dans le temps . Supposons que l'on nous donne deux chaînes et , et que la chaîne a des caractères distincts. Nous pouvons renommer le premier caractère de en 1, le second en 2 et ainsi de suite, en gardant une trace du numéro que nous avons attribué à chaque caractère dans une table. Puis enO(nlogn)ABAAB, nous renommons ses caractères à l'aide de cette table (c'est-à-dire que chaque occurrence de ce qui était le premier caractère A
est changée en 1, etc.). Enfin, nous recherchons une sous-séquence croissante la plus longue dans B
. Cela correspond à un LCS entre A
et B
, et à partir de là, nous pouvons immédiatement calculer la distance d'édition d'insertion / suppression. Le temps total nécessaire est juste si et ont respectivement des longueurs et .O(n+mlogm)ABnm
Limites de la distance de Levenshtein
La distance d'insertion / suppression fournit clairement une limite supérieure sur la distance de Levenshtein (puisque toute séquence valide d'opérations d'édition sous la distance d'insertion / suppression est également une séquence valide d'opérations d'édition de Levenshtein). La division de la distance d'édition d'insertion / suppression par 2 donne également une limite inférieure, car dans le pire des cas, toute opération d'édition de Levenshtein peut être changée en 2 opérations d'édition d'insertion / suppression.
Généralisations
Déjà en 1977, Hunt et Szymanski ont mis au point un algorithme qui peut être considéré comme une généralisation de l'algorithme de sous-séquence qui augmente le plus longtemps. Il est efficace lorsque le nombre de paires de positions de caractères correspondantes entre les deux chaînes est petit. S'il y a telles paires, leur algorithme prend temps. (Notez que si tous les caractères d'une chaîne sont distincts.) Cet algorithme était la base du programme original , qui traitait des lignes entières de texte comme des caractères individuels. est ensuite passé à l'utilisation de l' algorithme de temps Myers , oùrO((r+n)logn)r≤ndiff
diff
O(nd)d est la distance d'édition d'insertion / suppression, car cela fonctionne mieux lorsque les différences globales sont petites mais que certains "caractères" (lignes de texte) apparaissent fréquemment (comme une ligne contenant juste une accolade ouvrante dans le code de programme C).
Hunt, J .; Szymanski, T. (1977), "Un algorithme rapide pour calculer les sous-séquences communes les plus longues", Communications of the ACM, 20 (5): 350–353, doi: 10.1145 / 359581.359603