По крайней мере для более длинных строк вы должны получить лучшую производительность, используя другой алгоритм, который не должен вычислять все значения в матрице lena & sdot; lenb. Например, часто может не потребоваться вычислять точную стоимость угла [lena][0]
матрицы, которая представляет собой стоимость начала с удаления всех символов в a
.
Лучший алгоритм может заключаться в том, чтобы всегда смотреть на точку с наименьшим вычисленным весом, а затем идти на шаг вперед во всех направлениях оттуда. Таким образом, вы можете достичь целевого местоположения, не изучая все местоположения в матрице:
Реализация этого алгоритма может использовать приоритетную очередь и будет выглядеть следующим образом:
from heapq import heappop, heappush
def distance(a, b):
pq = [(0,0,0)]
lena = len(a)
lenb = len(b)
while True:
(wgh, i, j) = heappop(pq)
if i == lena and j == lenb:
return wgh
if i < lena:
# deleted
heappush(pq, (wgh+1, i+1, j))
if j < lenb:
# inserted
heappush(pq, (wgh+1, i, j+1))
if i < lena and j < lenb:
if a[i] == b[i]:
# unchanged
heappush(pq, (wgh, i+1, j+1))
else:
# changed
heappush(pq, (wgh+1, i+1, j+1))
# ... more possibilities for changes, like your "+(i-i1-1)+1+(j-j1-1)"
Это просто грубая реализация, ее можно было бы значительно улучшить:
- При добавлении новых координат в очередь проверьте:
- Если координаты уже были обработаны ранее, не добавляйте их снова
- Если координаты в данный момент находятся в очереди, сохраните только экземпляр с лучшим прикрепленным весом
- Использовать очередь приоритетов, реализованную в C вместо
heapq
module