【问题标题】:Solving a recurrence relation for a recursive function求解递归函数的递归关系
【发布时间】:2019-10-18 00:20:45
【问题描述】:

我需要为以下伪代码的最坏情况分析创建并求解递归关系。我正在计算数字加法(不包括 for 循环计数器)作为我的基本操作。 我假设 n=2^k。

这是我取得的进展... 基本情况: T(n

W(n)=W(2^k)=计算答案的加法+下一次递归中的加法+for循环中的加法 W(2^k) = 2 + W(2^(k-2)) + (2^k) - 2 = W(2^(k-2)) + (2^k)

我使用反向替换并得到以下递归关系...

对于第 j 个递归调用 W(2^k) = W(2^(k-2j)) + (2^k) + sum(t=1,j,2^(k-2(t-1)))

我知道我可以简化这个,因为我采用 W(2^(k-2j)) = W(4) 并求解 j 以查看代码需要多少递归步骤。 在这种情况下,j=(k/2) - 1. 减少重复给我...

W(2^k) = 1 + (2^k) + sum(t=1,j,2^(k-2(t-1)))。

减少总和给我...

W(2^k) = 1 + (2^k) + (2^k)*(2^2)*sum(t=1,j,2^(-2t)) 或

W(n) = 1 + n + 4n*sum(t=1,j,2^(-2t))

我无法简化的是总和。在讲座中,我们可能有 sum(i=1,n,2^i) 的总和,即 2^(n+1)-1,但这个不同。

int function calc(int n) {
   int num,answer;
   if(n<=4) {return n+10;}
   else {
     num=calc(n/4);
     answer=(num+num+10);
     for(int i=2;i<=n-1;i++) {
         answer=answer+answer;
     }
     return answer;
  }
}

任何帮助将不胜感激。这个任务今晚到期。谢谢

【问题讨论】:

    标签: algorithm recursion analysis recurrence


    【解决方案1】:

    问题的时间复杂度为T(n) = T(n/4) + n。术语n 可能意味着\Theta(n)。因此,T(n) = n + n/4 + n/4^2 + ... + n/(4^log_4(n)) = n(1 + 1/4 + ... + 1/n) = \Theta(n)。请注意,lim_{n\to \infty} 1 + 1/4 + ... + 1/4^log_4(n) = 4/3 是一个常数。

    【讨论】:

    • 感谢您指出当 n 接近无穷大时求和结果为常数 x n。这有助于找到算法的复杂度。
    • @RileyK 我很高兴。您可以接受这篇文章作为解决方案。
    【解决方案2】:
    • T(n) = T(2^k) // 假设
    • T(n) = T(n/4) + n // 是递归关系
    • T(2^k) = T(2^(k-2)) + (2^k) // 重写
    • T(2^k) = T(2^(k-2j)) + (2^k)*SUM(i=0;j-1;(1/4)^i) // 是关系对于迭代 j
    • T(4) = T(2^(k-2j)) = 1 // 当递归结束时,达到基本情况,只有 1 个加法
    • 2^2 = 2^(k-2j) // 重写并移除 T
    • 2=k-2j // 删除公共碱基
    • j=(k/2)-1 // 求解第 j 次迭代
    • 注意:迭代不能有小数,所以 j=CEILING((k/2)-1)
    • SUM(i=0;j-1;(1/4)^i) = (1-(1/4)^j)/(1-(1/4))
    • 有关上述几何和和变换证明,请参阅下面的 wiki 链接
    • 将 j 替换为 CEILING((k/2)-1),总和为...
    • SUM = (1-(1/4)^(CEILING((k/2)-1)))/(1-(1/4))
    • 最后,T(2^k) = 1 + (2^k)*SUM
    • 就输入 n 而言,T(n) = 1 + (n*SUM)
    • 这个公式适用于所有 k>=1

    测试几个值...

    • k=1, T(2) = 1 + (2*0) = 1 // 我们知道这是真的,因为 T(2) 是基本情况
    • k=2, T(4) = 1 + (4*0) = 1 // 我们知道这是真的,因为 T(4) 是基本情况
    • k=3, T(8) = 1 + (8*1) = 9 // 通过递推公式,T(8) = T(2) + 8 = 9, true
    • k=4, T(16) = 1 + (16*1) = 17 // 通过递归公式,T(16) = T(4) + 16 = 17, true
    • k=5, T(32) = 1 + (32*1.25) = 41 // 通过递推公式,T(32) = T(8) + 32, T(8) = 9, 32+9= 41 对

    对于几何和 https://en.wikipedia.org/wiki/Geometric_series

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-30
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 2014-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多