复发关系怎么办?

时间:2014-01-29 15:06:37

标签: algorithm time-complexity recurrence

n为此,我们前一天被告知复发关系,我们获得了一些练习代码:

int pow(int base, int n){

if (n == 0)

  return 1;

else if (n == 1)

  return base;

else if(n%2 == 0)

  return pow(base*base, n/2);

else

 return base * pow(base*base, n/2);

}

我必须得到它的闭合形式的最远是T(n)= T(n / 2 ^ k)+ 7k。 我不确定如何进一步,因为给我们的例子很简单,并没有那么多帮助。 你如何实际解决这段代码的递归关系?

1 个答案:

答案 0 :(得分:1)

我们只计算pow调用中的乘数,表示为M(N),假设它们支配成本(当前强烈无效的假设)。

通过检查代码,我们看到:

M(0) = 0(N = 0没有乘法)

M(1) = 0(N = 1没有乘法)

M(N),N> 1,N甚至= M(N/2) + 1(对于偶数N,一次乘法后的递归调用)

M(N),N> 1,N奇数= M(N/2) + 2(对于奇数N,在一次乘法后递归调用,然后是第二次乘法)。

由于它处理偶数和奇数整数的事实,这种复发有点复杂。我们将通过仅考虑偶数或奇数的序列来解决这个问题。

让我们首先处理N作为2的幂的情况。如果我们迭代公式,我们得到M(N) = M(N/2) + 1 = M(N/4) + 2 = M(N/8) + 3 = M(N/16) + 4。我们很容易发现模式M(N) = M(N/2^k) + k,以便解决方案M(2^n) = n。我们可以将其写为M(N) = Lg(N)(基数2对数)。

同样,N = 2^n-1总是会在除以2之后产生奇数。我们有M(2^n-1) = M(2^(n-1)-1) + 2 = M(2^(n-2)-1) + 4... = 2(n-1)。或M(N) = 2 Lg(N+1) - 2

一般N的确切解决方案可以相当复杂,但我们可以看到Lg(N) <= M(N) <= 2 Lg(N+1) - 2。因此M(N)O(Log(N))