Votre "mise en œuvre" a plusieurs défauts:
(1) Il devrait commencer par def lev(a, b):
, non def lev(s1, s2):
. S'il vous plaît prenez les bonnes habitudes de (a) exécuter votre code avant de poser des questions à son sujet (b) en citant le code que vous avez réellement exécuté (par copier/coller, pas par (retable) retaper).
(2) Il n'y a pas de conditions de terminaison; pour tous les arguments, il finira par essayer d'évaluer lev("", "")
qui serait bouclé à jamais s'il n'y avait pas les limites d'implémentation Python: RuntimeError: maximum recursion depth exceeded
.
Vous devez insérer deux lignes:
if not a: return len(b)
if not b: return len(a)
pour le faire fonctionner. (3) La distance de Levenshtein est définie récursivement. Il n'y a pas d'algorithme "le" (un et unique). Le code récursif est rarement vu à l'extérieur d'une salle de classe et seulement à titre de «pailleur».
(4) Les implémentations naïves prennent du temps et la mémoire est proportionnelle à len(a) * len(b)
... ces chaînes ne sont-elles pas normalement un peu plus longues que 4 à 8?
(5) Votre implémentation extrêmement naïve est pire, car elle copie des tranches de ses entrées.
Vous pouvez trouver travail implémentations non-très naïfs sur le web ... Google ("de python levenshtein") ... recherchez ceux qui utilisent O(max(len(a), len(b)))
la mémoire supplémentaire. Ce que vous avez demandé ("la distance d'édition pour la chaîne qui a la distance d'édition la plus courte pour les autres chaînes.") N'a pas de sens ... "LA chaîne" ??? "Il faut deux pour faire du tango" :-)
Ce que vous voulez probablement (trouver toutes les paires de chaînes dans une collection qui ont la distance minimale), ou peut-être juste cette distance minimale, est un exercice de programmation simple. Qu'avez-vous essayé? Par ailleurs, trouver ces paires par un algorithme simpliste prendra O (N ** 2) exécutions de lev()
où N est le nombre de chaînes dans la collection ... si c'est une application du monde réel, vous devrait chercher à utiliser du code éprouvé plutôt que d'essayer de l'écrire vous-même. Si c'est devoirs, vous devriez le dire.
Cette fonction de lev est-elle correcte? a et b ne sont pas définis, et si vous voulez que les args soient a et b, ils dépassent la limite de récursivité. – Hollister