【问题标题】:How to do recurrence relations?如何做递归关系?
【发布时间】:2014-01-29 15:06:37
【问题描述】:

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。 我不确定如何进一步,因为提供给我们的示例很简单,并没有太大帮助。 您如何实际解决此代码的递归关系?

【问题讨论】:

  • 7 是从哪里来的?什么是k? T 是否应该表示算法的复杂度?
  • 7 是我从获取代码的操作计数中得到的,顺便说一下 k = log n 是的,T 表示算法的复杂度。

标签: algorithm time-complexity recurrence


【解决方案1】:

让我们只计算调用pow 中的乘数,表示为M(N),假设它们占主导地位(现在是一个非常无效的假设)。

通过检查代码我们看到:

M(0) = 0(N=0 不乘)

M(1) = 0(N=1 不乘)

M(N), N>1, N even = 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))

【讨论】:

    猜你喜欢
    • 2014-10-02
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 2014-04-29
    • 2019-10-18
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多