Algorithm 编辑距离(Levenshtein距离)递归自顶向下实现的复杂性

Algorithm 编辑距离(Levenshtein距离)递归自顶向下实现的复杂性,algorithm,big-o,complexity-theory,levenshtein-distance,edit-distance,Algorithm,Big O,Complexity Theory,Levenshtein Distance,Edit Distance,我整天都在为一个我似乎无法解决的问题而工作。任务是证明编辑距离的递归实现具有时间复杂度Ω(2max(n,m)),其中n&m是被测单词的长度 该实现与这个小型python示例相当 def lev(a, b): if("" == a): return len(b) # returns if a is an empty string if("" == b): return len(a) # returns if b is an empty stri

我整天都在为一个我似乎无法解决的问题而工作。任务是证明编辑距离的递归实现具有时间复杂度Ω(2max(n,m)),其中n&m是被测单词的长度

该实现与这个小型python示例相当

def lev(a, b):
    if("" == a):
       return len(b)   # returns if a is an empty string
    if("" == b):
        return len(a)   # returns if b is an empty string
    return min(lev(a[:-1], b[:-1])+(a[-1] != b[-1]), lev(a[:-1], b)+1, lev(a, b[:-1])+1)
发件人:

我曾尝试为不同的短单词绘制递归深度的树,但我找不到树深度和复杂性之间的联系

我的计算中的递归公式

m = length of word1
n = length of word2
T(m,n) = T(m-1,n-1) + 1 + T(m-1,n) + T(m,n-1)
With the base cases:
T(0,n) = n
T(m,0) = m
但我不知道如何继续,因为每次通话都会导致3次新通话,因为通话长度没有达到0


关于如何证明下限复杂度为Ω(2max(n,m))的任何提示,我将不胜感激。

您的递归公式:

T(m,n) = T(m-1,n-1) + T(m-1,n) + T(m,n-1) + 1
T(0,n) = n
T(m,0) = m
这是对的

你可以看到,每一个
T(m,n)
都会将的拆分为三条路径。由于每个节点都在
O(1)
中运行,因此我们只需对节点进行计数

最短路径的长度为
min(m,n)
,因此树至少有
3min(m,n)
节点。但有些道路更长。通过交替减少第一个和第二个字符串,可以获得最长路径。此路径的长度为
m+n-1
,因此整个树最多有
3m+n-1
个节点

m=min(m,n)
。该树还包含至少

不同的路径,每种可能的还原顺序一条


所以,
Ω(2max(m,n))
Ω(3min(m,n))
是下限,
O(3m+n-1)
是上限。

你确定大ω吗?让n保持不变为1。然后我们可以很容易地看到,复杂性是km(树几乎是一个列表),对于m>=m\0,非常清楚的是km<2^m=2^max(1,m)