查找(递归算法的)线性递归

时间:2019-07-08 17:17:51

标签: algorithm time-complexity complexity-theory

我需要帮助来找到递归算法的复杂性;我知道为了解决这个问题,我必须找到线性递归,然后应用主定理。据我所知,仅考虑一个参数就可以很容易找到复发;
在这种情况下,有两个参数(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)

即使我可以尝试猜测这种关系并从中弄清楚,我也不知道如何正式证明它。
如果我的猜测是正确的,那么您如何得出这个结论?如果没有,我想念什么?

很长的问题,很抱歉,谢谢您

1 个答案:

答案 0 :(得分:1)

当您在returnfor时,这意味着该功能将始终以恒定的复杂度完成!因为所有时间都转到for循环,并且return函数的值和所有内容都已完成,并且可以返回结果了。

此外,经常性关系的证据来自您的分析。如果在组合算子中使用某种计数原理,将证明最终结果。

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