【问题标题】:Finding the linear recurrence (of a recursive algorithm)寻找线性递归(递归算法的)
【发布时间】:2019-07-08 17:17:51
【问题描述】:

我需要帮助找出递归算法的复杂性;我知道为了解决这个问题,我必须找到线性递归,然后应用主定理。据我所知,当只考虑一个参数时,找到递归将很简单;
在这种情况下,有两个参数(i,j)。考虑下面在 (A,1,n) 上调用的函数:

   integer stuff(integer [] A, integer i, integer j){
           if i ≥ j then return i – j 
           integer h ← 0
           for integer k ← 1 to floor((j – i + 1)/3) do {
              h ← h + 1
           }
           return stuff(A, i , i + h) + stuff(A, j – h, j) – stuff(A, i + h + 1, j – h − 1)
   }

假设各种事情,我猜的关系是:

T(1) = k  
T(n) = T(n/3) + T(n/3) + T(n/3) + 1/3*n = 3*T(n/3) + 1/3*n

我假设是因为看起来该函数是在 3 的 3 部分中调用的,其中每个部分是 n 的三分之一;是 h = O(n/3)

First call: h+i-i = h ~ n/3   
Second call: j-(j-h) = h ~ n/3   
Third call: j-h-1-(i+h) = j-i-2h ~ n/3 (which I only assumed)

尽管我可以尝试猜测这种关系并从中理解,但我不知道如何正式证明它。
如果我的猜测是正确的,你如何得出这个结论?如果没有,我错过了什么?

抱歉问了这么长的问题,提前谢谢

【问题讨论】:

    标签: algorithm time-complexity complexity-theory


    【解决方案1】:

    当您在for 中使用return 时,这意味着函数将始终以恒定的复杂性完成!因为一直到for循环,它return函数的值,一切都完成了,结果准备好返回了。

    此外,循环关系的证明来自您的分析。如果你使用组合数学中的一些计数原理,最终的结果将得到证明。

    此外,如果您更正伪代码并将return 放在函数的末尾,则复杂度为T(n) = 3T(n/3) + \Theta(n)(正如您所分析的那样)。现在,根据主定理,你可以说T(n) = n log(n))

    【讨论】:

    • 感谢您指出我写退货的错误。我对这个主题很陌生,我仍然不明白我们如何以及为什么可以在整个循环中将j-i-2h(在这种特殊情况下)近似为 n/3。我的意思是,为什么我们可以假设变量i 为常量并忽略它?
    • 并且概括地说,这种考虑参数间隔的方法是否每次都适用于 k 个参数取决于 n 的函数?还是取决于函数对 thoes 参数的作用(因为在stuff(A,i,j) 的情况下,循环的复杂性取决于两个参数之间的差异)?无论如何,谢谢你的回答
    • @ungukla 确实这里的常数值不会改变渐近复杂度。此外,只有第一级在编写循环关系时很重要。在第一级jni1 只是你可以忽略i 那里。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多