Je cherchais un algorithme avancé de distance levenshtein, et le meilleur que j'ai trouvé jusqu'à présent est O (n * m), où n et m sont les longueurs des deux chaînes. La raison pour laquelle l'algorithme est à cette échelle est due à l'espace, pas au temps, avec la création d'une matrice des deux chaînes telles que celle-ci:
Existe-t-il un algorithme de levenshtein accessible au public, meilleur que O (n * m)? Je ne suis pas opposé à l'examen de documents et de recherches en informatique avancée, mais je n'ai rien trouvé. J'ai trouvé une société, Exorbyte, qui aurait construit un algorithme de Levenshtein ultra-avancé et ultra-rapide, mais il s'agit bien sûr d'un secret commercial. Je construis une application iPhone pour laquelle j'aimerais utiliser le calcul de la distance de Levenshtein. Il existe une implémentation objective-c disponible , mais avec la quantité de mémoire limitée sur les iPod et les iPhones, j'aimerais trouver un meilleur algorithme si possible.
Souhaitez-vous réduire la complexité temporelle ou spatiale? La complexité temporelle moyenne peut être réduite O (n + d ^ 2), n étant la longueur de la chaîne la plus longue et d la distance d'édition. Si vous êtes uniquement intéressé par la distance d'édition et non intéressé par la reconstruction de la séquence d'édition, il vous suffit de conserver en mémoire les deux dernières lignes de la matrice, ce sera donc l'ordre (n).
Si vous pouvez vous permettre une approximation, il existe des approximations poly-logarithmiques.
Pour l’algorithme O (n + d ^ 2), recherchez l’optimisation d’Ukkonen ou son amélioration Enhanced Ukkonen . La meilleure approximation que je connaisse est celle de Andoni, Krauthgamer, Onak
Si vous souhaitez uniquement utiliser la fonction de seuil (par exemple, pour vérifier si la distance est inférieure à un seuil donné), vous pouvez réduire la complexité temporelle et spatiale en calculant uniquement les n valeurs de part et d'autre de la diagonale principale du tableau. Vous pouvez également utiliser Levenshtein Automata pour évaluer plusieurs mots par rapport à un mot de base unique en O(n) _ et la construction des automates peut être effectuée en O(m) le temps aussi.
Regardez dans le wiki - ils ont quelques idées pour améliorer cet algorithme afin de mieux gérer la complexité de l'espace:
Wiki-Link: distance de Levenshtein
Citant:
Nous pouvons adapter l'algorithme pour qu'il utilise moins d'espace, O(m) au lieu de O (mn), car il ne nécessite que le stockage de la ligne précédente et de la ligne actuelle à un moment donné.
J'ai trouvé une autre optimisation qui prétend être O (max (m, n)):
http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#C
(la deuxième mise en œuvre C)