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 = x1… Xny= y1… Ymré( x , y)
min ⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪ré( x , y1… Ym - 1) + 1ré( x , y2… Ym) + 1ré( x , y1… Ym / 2) + 1ré( x1… Xn / 2, y) + 1ré( x1… Xn, y) + 1ré( x1…Xn - 1,y1…Ym -1)si y= y1… Ym / 2y1… Ym / 2si x = x1… Xn / 2X1… Xn / 2si yn= ym▻ Ajouter une lettre à la fin▻ Ajouter une lettre au début▻ Doubler▻ Réduire de moitié▻ Suppression▻ 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∗
UNE∗UNE∗UNE∗courir. (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).
- UNE∗UNE∗
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.