Modifier la distance de la liste avec des éléments uniques


12

La distance d'édition entre les listes Levenshtein-Distance est un problème bien étudié. Mais je ne trouve pas grand-chose sur les améliorations possibles s'il est connu qu'aucun élément ne se produit plus d'une fois dans chaque liste .

Supposons également que les éléments soient comparables / triables (mais les listes à comparer ne sont pas triées pour commencer).

En particulier, je suis intéressé si l'unicité des éléments permet d'améliorer l'algorithme d' Ukkonen pour la distance d'édition qui a la complexité temporelle et la complexité spatiale O (\ min (s, m, n) s) , où s est le coût minimum des étapes d'édition .O(min(m,n)s)O(min(s,m,n)s)s

Plus formellement,

avec quelle efficacité pouvons-nous calculer la distance d'édition entre deux chaînes données s,tΣ avec la promesse qu'elles n'ont pas de lettres répétées?

Σ est un très grand alphabet.


Quelle est votre question maintenant; comment accélérer la distance d'édition par paire, ou comment accélérer le calcul de toutes les distances par paire d'une liste de chaînes?
Raphael

2
Je soupçonne que la question est: comment calculer la distance d'édition entre , où sont des chaînes sur un très grand alphabet , et nous sommes garantis qu'aucune lettre n'apparaît deux fois dans ou en (l'OP représente chaque chaîne comme une liste de lettres, c'est-à-dire une liste d'éléments). Mais cela doit être confirmé. s,ts,tΣΣst
DW

Oui, dans ce cas le grand alphabet est composé d'index de base de données et les "chaînes", s et t, sont des listes contenant ces index.
user362178

Pour ceux qui s'interrogent sur les complexités: et sont les longueurs des chaînes d'entrée et est la distance d'édition réelle, donc elle est incluse dans la complexité. Le coût de chaque édition est considéré comme 1 mais n'est probablement pas pertinent pour le calcul de cette distance (le nombre d'éditions ). mnss
Albert Hendriks

Réponses:


3

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+m2L : 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 CIRCLEet TRICKLE, ICLEa une longueur de 4, et la distance d'édition est en effet .6+724=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 Aest changée en 1, etc.). Enfin, nous recherchons une sous-séquence croissante la plus longue dans B. Cela correspond à un LCS entre Aet 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)rndiffdiffO(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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.