递归函数的渐近时间复杂度

时间:2013-09-30 03:36:30

标签: c++ algorithm recursion time-complexity asymptotic-complexity

我被要求开发一个递归函数,然后分析渐近时间复杂度。

f(N) = 0, if N < N1

f(N1) = C1

f(N)= A1 + M1*f(M2*N/D1 - S1) Op M3*f(M4*N/D2 - S2), if N > N1

我们假设:

s1 = s2 = 0

m2 = m4 = 1

d1 = d2> 1

//the user enters N1 C1 A1 M1 M2 M3 M4 D1 D2 S1 S2 and then ARG

int Recursion_Plus(int ARG)
{

    if (ARG < n1)
    {
        return 0;
    }

    else if(ARG == n1)
   {
    return c1;
   }

   else if(ARG > n1 )
   {

    return a1 + m1 
    * 
    Recursion_Plus(m2*ARG/d1 - s1) 
    + 
    m3*Recursion_Plus(m4*ARG/d2 - s2);

   }

}

我已经针对教师的程序测试了我的递归函数,它的工作原理完全一样,所以我转到了我的分析,我已经碰壁了。

我正在努力将我的大脑包裹起来,所以请耐心等待。

我尝试部分解决方案:

2次比较(如果ARG&lt; N1&amp;如果ARG == N1)需要1个单位时间

a1&amp; m1&amp; m3是微不足道的,因为它们不在递归调用中

a1 + m1 * _ = 1个时间单位(加法)

m1 * _ = 1个时间单位(乘法)

将2个递归调用加在一起是1个时间单位

m3 * _ = 1个时间单位(乘法)

根据我们给出的指令,每次都使用相同的#调用两个递归函数,并且递归函数调用的每个连续数将小于最后一个,因为d1 = d2&gt; 1。

因此,较大的ARG(与n1相比),到达基本情况所需的时间越长,结果就越大。那么算法需要O(ARG)时间?

如果我走在正确的轨道上,如果有人能让我知道,我会很感激。感谢

2 个答案:

答案 0 :(得分:3)

递归调用是:

f(N)= A1 + M1*f(M2*N/D1 - S1) Op M3*f(M4*N/D2 - S2), if N > N1

s1 = s2 = 0
m2 = m4 = 1
d1 = d2 > 1

我们有

f(N)= A1 + M1*f(N/D1) Op M3*f(N/D1), if N > N1

递归调用是获得渐近复杂度的关键点,其余的是“只是”常量。

所以重点是找到如:

的T.
T(n)=2*T(n/D)

一旦找到T(n),你就得到了Recursion_Plus的调用次数,因为我们所说的渐近复杂性与最后一次调用无关(即n<N1)。

现在一切都是关于数学的,我不会在这里描述一个正式的解决方案,但只要有一点直觉就可以得到结果。

T的每次调用都会引发2次T调用,但是#D除以D,然后4次调用#divide除以D ^ 2 ...

复杂度为2^(logD(n))logD(n)=ln(N)/ln(D) )

特殊情况:with D=2, the complexity is n

答案 1 :(得分:0)

请注意,在每个递归级别上,您都会调用该函数两次。因此,从第一次调用c1开始,它会自行调用两次:c21c22,然后从这些调用中再次调用两次:c211c212c221c222等。在每个递归级别,您有两次以上的呼叫。在第N级,你将有2 ^ n个调用,因此它具有指数复杂性。

编辑:抱歉,我的不好。我没有注意到那个论点是分开的。在那种情况下,不会有N级,只有log d (N),其余的都是Tony写的。