我正在研究算法问题,这是Levenshtein距离(最小编辑距离)的修改版本。
现在为字符串提供了一个字符长度数组,并返回计算的距离。
示例:
EX1。
string1 =" egg"长度[1,1,1]
string2 ="例如"长度[1,1.5]
它们的距离为0.5(在字符串2的末尾插入一个' g'长度为0.5)
EX2。
string1 ="引出"长度为[1,1,1,1,1,1] string2 ="非法"长度[0.9,1.2,1,0.9,0.9,1.1]它们的距离为1.9 + 0.2 + 1 + 0 + 0.1 + 0.1 + 0.1 = 3.4
一个近似的解决方案是尝试将字符采样到相同的长度,问题将使用Wagner-Fischer算法在O(n ^ 2)中解决它的动态编程解决方案。但是,由于我们对它进行了采样,它将成为量化误差的近似解。
我试图想出一个像下面这样的递归版本,但它非常慢。我试图使用哈希来保存计算值,以便为递归剪切分支但看起来仍然很糟糕。
Python中的递归版本:
def lev(a, a_lens, b, b_lens):
if not a:
return sum(b_lens)
elif not b:
return sum(a_lens)
else:
if a_lens[0] < b_lens[0]:
_b_lens = b_lens[:]
_b_lens[0] -= a_lens[0]
if a[0] == b[0]:
change = lev(a[1:], a_lens[1:], b, _b_lens)
else:
change = MAX
else:
_a_lens = a_lens[:]
_a_lens[0] -= b_lens[0]
if a[0] == b[0]:
change = lev(a, _a_lens, b[1:], b_lens[1:])
else:
change = MAX
insert = b_lens[0] + lev(a, a_lens, b[1:], b_lens[1:])
delete = a_lens[0] + lev(a[1:], a_lens[1:], b, b_lens)
minimum = min(change, insert, delete)
return minimum
如何改进?是否有可能实现O(n ^ 2)?欢迎任何语言。感谢。