递归编辑距离相似算法

时间:2019-02-05 12:25:21

标签: algorithm recursion

我被赋予一项任务来查找二进制int数组(例如011011)与此类之间的“编辑距离”

共有3个选项:1.从右侧移除位2.从左侧移除位,3.不执行任何操作

现在,如果我们删除一个位,则距离将减少1,如果位匹配,则距离将增加1。

因此,例如:s1 = 01010101 s2 = 10101010我们可以删除s1(-1)中最左边的位和s2(-1)中最右边的位,得到s1 = 1010101和s_2 = 1010101,即7-2 = 5

我正在尝试编写算法并考虑以下方面:

fun(s1,s2){
    if s1[i] == s2[i]
        score++
    else
        return min(fun(s1[n-1],s2),fun(s1,s2[n-1]),fun(s1+1,s2),fun(s1,s2+1))-1
}

如何从这里继续?

1 个答案:

答案 0 :(得分:1)

总共有四个选项,从s1删除最左边的位,从s1删除最右边的位,从s2删除最左边的位,从s2删除最右边的位。尝试所有四种口味,并尽量少吃。这是在python中使用备忘录的python解决方案。

memo = {}
def fun(s1, s2):
    if s1 == s2:
        return 0
    if (s1, s2) in memo:
        return memo[s1, s2]
    r = 1e10 # infinity
    if len(s1) > 0:
        # remove left bit from s1
        r = min(r, 1 + fun(s1[1:], s2))
        # remove right bit from s1
        r = min(r, 1 + fun(s1[:-1], s2))
    if len(s2) > 0:
        # remove left bit from s2
        r = min(r, 1 + fun(s1, s2[1:]))
        # remove right bit from s2
        r = min(r, 1 + fun(s1, s2[:-1]))
    memo[s1, s2] = r
    return r
fun('01010101', '10101010') # 2    

这可以通过使用子字符串的索引而不是将字符串作为参数来进一步优化。时间复杂度为O(n^4)。我认为实际上不能随便从任何地方插入或删除字符这一事实使它的复杂性更高。我认为可以减少它。