我对有效地计算编辑距离感兴趣,因此请阅读wikibooks上的6种不同版本。但是,它们似乎都在某种程度上效率低下。取得版本6。
def levenshtein(s, t):
''' From Wikipedia article; Iterative with two matrix rows. '''
if s == t: return 0
elif len(s) == 0: return len(t)
elif len(t) == 0: return len(s)
v0 = [None] * (len(t) + 1)
v1 = [None] * (len(t) + 1)
for i in range(len(v0)):
v0[i] = i
for i in range(len(s)):
v1[0] = i + 1
for j in range(len(t)):
cost = 0 if s[i] == t[j] else 1
v1[j + 1] = min(v1[j] + 1, v0[j + 1] + 1, v0[j] + cost)
for j in range(len(v0)):
v0[j] = v1[j]
return v1[len(t)]
此代码存储动态编程矩阵的两行,我认为您只需要存储一行和一个临时变量。它还会在以下位置重复复制行v1
:
for j in range(len(v0)):
v0[j] = v1[j]
但是,要使不执行任何操作的版本似乎很困难 复制并仅存储一行。谁能看到该怎么做?
最终,我会将代码转换为C或Cython,但我想首先在Python中正确使用逻辑。