Nombre le plus court de déplacement d'édition entre deux mots

11

Je recherche une structure de données et un algorithme pour calculer le nombre minimum de changements requis pour transformer un mot en un autre, étant donné les deux mots en entrée, où les seuls changements autorisés sont

  • ajouter une lettre à l'une des extrémités (par exemple, AB -> ABC),
  • dupliquer et concaténer le mot entier (par exemple, ABC -> ABCABC),
  • couper un mot en deux (le double du mouvement de duplication, ABCABC -> ABC + ABC),
  • supprimez l'une des lettres (par exemple, ABC -> AC), et
  • répétez l'une des lettres (par exemple, ABC -> ABBC).

Par exemple, une séquence minimale de déplacements d'ABC vers BCBC est ABC -> BC (supprimer A) -> BCBC (duplication).

Je n'ai pas de formation en informatique. C'est peut-être un problème bien connu, mais ma recherche Google ne m'a rien donné.

Connaissez-vous un problème connexe et bien défini?

Edit : Comme suggéré dans la réponse d'Anthony Labarre, j'ai lu quelques articles sur le problème de permutation / arrangement de posets qui est similaire au problème décrit ci-dessus. Quelqu'un en sait-il plus sur ce problème? Est-ce pertinent?

cz3rk
la source
1
Vraisemblablement, aucun élément de la liste en.wikipedia.org/wiki/String_metric ne s'applique, ni dans sourceforge.net/projects/simmetrics ?
András Salamon
Je ne les connais pas tous, mais la plupart du but de ces méthodes est d'aligner des chaînes avec un seul changement de lettre autorisé et ne permettant pas de mouvements plus complexes.
cz3rk
1
Une duplication s'applique sur toute la chaîne ABC -> ABCABC, donc la direction n'a pas d'importance. Mais le sens de la répétition ne peut être que dans l'ordre gauche droite, comme un balbutiant.
cz3rk
2
Pourquoi est-ce important si les mots saisis ne partagent pas de lettres? (Il devrait y avoir une chaîne vide entre Aet Bdans la séquence de @ reinerpost.)
Jeffε
2
Vous avez ajouté l'opération "couper un mot en deux"; voulez-vous dire l'opération qui mappe à w ? www
argentpepper

Réponses:

3

Je ne sais pas si ce problème exact a été étudié, mais Chaudhuri et al. étudié le problème connexe de duplication-perte aléatoire en tandem : on vous donne une permutation, et vous voulez la transformer en permutation d'identité en (1) dupliquant un segment de n'importe quelle longueur et en ajoutant la copie juste après l'original, puis (2) supprimant éléments afin que vous obteniez une nouvelle permutation au lieu d'une chaîne. Notez que l'application de (1) puis (2) représente une opération.

Différentes variantes peuvent être définies en fonction du poids donné à chaque opération, qui dans leur papier dépend de la largeur des segments dupliqués. Ils étudient également un problème similaire avec la duplication du génome entier , qui est exactement le type de duplication que vous autorisez. Je ne me souviens pas avoir lu sur le travail sur ce problème dans le contexte des chaînes, mais j'espère que cela peut au moins vous donner un point de départ pour vos recherches.

Anthony Labarre
la source
Merci, je vais jeter un œil à leur travail. Je peux voir la relation entre les deux problèmes.
cz3rk
2

Comme cela a été souligné, ce problème est similaire au problème de distance d'édition le plus communément connu (sous-jacent à la distance Levenshtein ). Il a également des points communs avec, par exemple, la distance de distorsion temporelle dynamique (la duplication, ou «bégaiement», dans votre dernière exigence).

Étapes vers une programmation dynamique

X=X1Xny=y1ym(X,y)

min{(X,y1ym-1)+1▻ Ajouter une lettre à la fin(X,y2ym)+1▻ Ajouter une lettre au début(X,y1ym/2)+1si y=y1ym/2y1ym/2▻ Doubler(X1Xn/2,y)+1si X=X1Xn/2X1Xn/2▻ Réduire de moitié(X1Xn,y)+1▻ Suppression(X1Xn-1,y1ym-1)si yn=ym▻ Ignorer le dernier elt.

Ici, la dernière option dit essentiellement que la conversion de FOOX en BARX est équivalente à la conversion de FOOX en BAR. Cela signifie que vous pouvez utiliser l'option «ajouter une lettre à la fin» pour obtenir l'effet de bégaiement (duplication) et la suppression à un moment donné. Le problème est qu'il vous permet d' ajouter automatiquement un arbitraire caractère au milieu de la chaîne , ainsi , quelque chose que vous ne voulez probablement pas. (Cette «ignorer les derniers éléments identiques» est la manière standard de réaliser la suppression et le bégaiement dans des positions arbitraires. Cela rend l'interdiction des insertions arbitraires, tout en permettant des ajouts à chaque extrémité, un peu délicate, cependant ...)

J'ai inclus cette ventilation même si elle ne fait pas complètement le travail, au cas où quelqu'un d'autre pourrait la "sauver", d'une manière ou d'une autre - et parce que je l'utilise dans ma solution heuristique, ci-dessous.

(Bien sûr, si vous pouviez obtenir une ventilation comme celle-ci qui définissait réellement votre distance, vous n'auriez qu'à ajouter une mémorisation et vous auriez une solution. Cependant, parce que vous ne travaillez pas uniquement avec des préfixes, je ne le fais pas '' Je pense que vous ne pouvez utiliser que des index pour votre mémorisation; vous devrez peut-être stocker les chaînes réelles et modifiées pour chaque appel, ce qui deviendrait énorme si vos chaînes sont de taille importante.)

Étapes vers une solution heuristique

UNE UNE

UNEUNEUNEcourir. (Un compromis temps / espace là-bas.)

Donc…

L'efficacité de ma solution proposée semble dépendre un peu de (1) la longueur de vos chaînes et (2) de la taille de votre alphabet. Si aucun n'est énorme, cela pourrait fonctionner. C'est:

  • Implémentez la limite inférieure de votre distance en utilisant ma décomposition récursive et ma programmation dynamique (par exemple, en utilisant une fonction récursive mémorisée).
  • UNEUNE

Je ne peux pas vraiment donner de garantie quant à son efficacité, mais elle devrait être correcte, et ce serait probablement beaucoup mieux qu'une solution à force brute.

Si rien d'autre, j'espère que cela vous donne quelques idées pour de nouvelles investigations.

Magnus Lie Hetland
la source
0

Un problème connexe et bien défini serait un problème d' alignement de séquence . C'est différent car il n'utilise pas d'opération de duplication. Les opérations définies sont: insertion de caractère, suppression de caractère, transformation de caractère. Needleman-Wunsch est l' algorithme le plus utilisé pour résoudre ce problème .

Martinsos
la source
Je connais celui-ci mais je veux vraiment travailler avec un ensemble de mouvements définis. La seule façon que j'ai trouvée de le faire, c'est avec un algorithme récursif de force brute. Pas très gentil et il pourrait devenir intensif en calcul si la taille des mots augmentait.
cz3rk