我在赋值中得到了一个递归算法,我需要证明它具有给定的时间复杂度。
算法如下(用Java编写)
int partDist(String w1, String w2, int w1len, int w2len) {
if (w1len == 0)
return w2len;
if (w2len == 0)
return w1len;
int res = partDist(w1, w2, w1len - 1, w2len - 1) +
(w1.charAt(w1len - 1) == w2.charAt(w2len - 1) ? 0 : 1);
int addLetter = partDist(w1, w2, w1len - 1, w2len) + 1;
if (addLetter < res)
res = addLetter;
int deleteLetter = partDist(w1, w2, w1len, w2len - 1) + 1;
if (deleteLetter < res)
res = deleteLetter;
return res;
}
分配是为了证明该算法确实具有时间复杂度Omega(2 ^ max(n,m)),其中n和m分别是w1和w2的长度。我在这方面的知识很少,至少可以说,但我设法找到一个video on youtube分析Fibonacci序列递归非常有帮助。
我基本上尝试使用我的算法从视频中反向设计解决方案,但我最终得到时间复杂度Omega(3 ^ min(n,m))。
我得出这个结论的方式,这绝不是我确定的正确方法,是我通过说T(n)来计算一种下界(我猜?) -1,m-1)= T(m,n-1)和T(m-1,n)(我认为这些是另外两个术语)。之后,我只需将公式扩展两到三步并进行概括。然后我结束了上面的时间复杂性。我不明白时间复杂度如何是2 ^(max(n,m)),因为每一个都有3个额外的递归调用,我不明白为什么它的最大值而不是min,因为当两个长度中的一个为零时,该方法是线性的(对吗?)。
答案 0 :(得分:1)
运行时必须遵循重复
T(n, m) = T(n - 1, m - 1) + T(n, m - 1) + T(n - 1, m) + T
T(0, m) = T'
T(n, 0) = T"
功率为2的解决方案不太可能,因为单个呼叫涉及三个间接呼叫。