У вашей "реализации" есть несколько недостатков:
(1) Он должен начинаться с def lev(a, b):
, а не def lev(s1, s2):
. Пожалуйста, ознакомьтесь с хорошими привычками (а) запуска своего кода перед тем, как задавать вопросы о нем (б) цитирования кода, который вы на самом деле выполняли (копированием / вставкой, а не повторным вводом (подверженным ошибкам)).
(2) не имеет условий прекращения; для любых аргументов он в конечном итоге попытается вычислить lev("", "")
, который будет зацикливаться вечно, если бы не пределы реализации Python: RuntimeError: maximum recursion depth exceeded
.
Вам нужно вставить две строки:
if not a: return len(b)
if not b: return len(a)
чтобы это заработало.
(3) Расстояние Левенштейна определено рекурсивно. Не существует такого понятия, как «единственный» алгоритм. Рекурсивный код редко можно увидеть за пределами классной комнаты, а затем только в качестве "сторожа".
(4) Наивные реализации требуют времени и памяти, пропорциональных len(a) * len(b)
... разве эти строки обычно не длиннее, чем от 4 до 8?
(5) Ваша крайне наивная реализация хуже, потому что она копирует фрагменты своих входных данных.
Вы можете найти работающих не очень наивных реализаций в Интернете ... google ("levenshtein python") ... искать те, которые используют O(max(len(a), len(b)))
дополнительную память.
То, что вы просили ("расстояние редактирования для строки, которая имеет самое короткое расстояние редактирования для других строк.") Не имеет смысла ... "THE string" ??? «Для танго нужны двое»: -)
То, что вы, вероятно, хотите (найти все пары строк в коллекции с минимальным расстоянием) или, может быть, просто это минимальное расстояние, - простое упражнение по программированию. Что вы пробовали?
Кстати, нахождение этих пар по упрощенному алгоритму потребует O (N ** 2) выполнений lev()
, где N - количество строк в коллекции ... если это реальное приложение, Вы должны использовать проверенный код, а не пытаться писать его самостоятельно. Если это домашнее задание, вам следует так сказать.