递归算法的时间复杂度(伪代码)

时间:2017-10-04 18:21:13

标签: algorithm time-complexity analysis

如果我们有这样的代码(伪),这个递归调用的时间复杂度是多少?假设下面未说明的任何内容被视为固定时间。

a,b,c > 0

//some code above, then we get here 

for i = 0 to a
    recursive(i,b)

//code continues

FUNCTION recursive(i,b)
if b = 0
    return 0

for j = i+c to a
    recursive(j,b-1)
ENDFUNC

修改 我主要是在确定它是否是指数时遇到问题。深度显然是b,并且在递归函数中进行调用,给出O(b * a),但是主循环也调用它一次,这使得我认为它应该总计:O(a ^ 2 * b),但是我不太明白如何产生指数复杂性,所以我想知道它是否会成为那样的呢?

1 个答案:

答案 0 :(得分:0)

首先,让我们先看看两个简单的嵌套循环:

for i (1..N) {
   for j (1..N) {
      f();
   }
}

for i (1..N) {
   for j (i..N) {
      g();
   }
}

f()被称为N*N = N2 = O(N2)次。

g()被称为N+(N-1)+...+5+4+3+2+1 = N(N+1)/2 = N2/2 + N/2 = O(N2)次。

如您所见,内环开始的位置并不重要;复杂性将是相同的。

其次,让我们看看如果你添加一个嵌套级别会发生什么。

for i (1..N) {
   for j (1..N) {
      for k (1..N) {
          h();
      }
   }
}

我们已经知道两个外部循环是O(N2),我们正在进行N次,所以我们得到O(N3)。我们可以看到指数是嵌套量。

如果我们开始展开recursive,我们就会

for i2 = i+c to a
    recursive(i2, b-1)

for i2 = i+c to a
   for i3 = i2+c to a
       recursive(i3, b-2)

for i2 = i+c to a
   for i3 = i2+c to a
       for i4 = i3+c to a
           recursive(i4, b-3)

如您所见,您有b个嵌套循环,它们遍历a-c个元素的子集。应用我们上面学到的知识,recursive需要O((a-c)b)时间。

整个代码(即对recursive的调用加上外部循环)会添加另一个图层,因此需要O((a-c)b * a)次。