【发布时间】:2016-04-13 18:49:00
【问题描述】:
我不明白最长公共子序列算法的递归函数所具有的O(2^n) 复杂性。
通常,我可以将此表示法与算法的基本操作(在本例中为比较)的数量联系起来,但这一次在我看来没有意义。
例如,有两个长度相同的字符串5。在最坏的情况下,递归函数计算251 比较。而2^5 甚至还没有接近那个值。
谁能解释一下这个函数的算法复杂度?
def lcs(xstr, ystr):
global nComp
if not xstr or not ystr:
return ""
x, xs, y, ys = xstr[0], xstr[1:], ystr[0], ystr[1:]
nComp += 1
#print("comparing",x,"with",y)
if x == y:
return x + lcs(xs, ys)
else:
return max(lcs(xstr, ys), lcs(xs, ystr), key=len)
【问题讨论】:
-
您可能希望包含您正在查看并试图理解的特定算法描述。
-
Big-O 复杂度决定了函数对于非常大的值如何增长,直至一个常数因子。一个算法可以是 O(1) 并且仍然需要 1 亿次操作。或
O(n)并为n=1获取50000 次操作,为n=2获取10000 次操作。这完全取决于它如何随着 N 的任意增长而增长。此外,5 是一个极小的n值。没有算法,就没什么好说的了。 -
@CollinD 但是有两个字符串,它们的大小甚至可能不同,n 是什么?
-
我正在将算法添加到帖子中。
-
在这种情况下,n 可能是较长字符串的长度。
标签: algorithm recursion lcs subsequence