编辑距离算法(Levenshtein距离)与字符有不同的长度?

时间:2016-09-22 06:06:12

标签: python algorithm recursion

我正在研究算法问题,这是Levenshtein距离(最小编辑距离)的修改版本。

现在为字符串提供了一个字符长度数组,并返回计算的距离。

  • 删除长度为n的字符将花费n距离,以便插入字符。
  • 替换可以被视为删除,插入成本为2n距离。
  • 您可以部分删除字符或插入任意长度的字符。

示例:

  

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)?欢迎任何语言。感谢。

0 个答案:

没有答案