计算递归算法的时间复杂度



我刚刚开始解决Topcoder算法问题,并用Java为SRM 466div 2 LotteryTticket问题编写了此算法。

由于我不擅长时间复杂性,所以如果有人能解释我如何一步一步地计算这个算法的时间复杂性。

public static String buy1(int price,int...b){
    int sum=0; String stat="IMPOSSIBLE";
    for(int i=0;i<b.length;i++)
        sum=sum+b[i];
    if(sum==price)
        return "POSSIBLE";
    if(b.length>1){
        stat=buy1(price,Arrays.copyOfRange(b,0,b.length-1));
        stat=buy1(price,Arrays.copyOfRange(b,1,b.length));
    }
    return stat;
}

对于您的案例,递归关系为(设b.length()为bn)

                     ___________buy1(p,bn-1) (as (b,0,b.length-1) equivalent is bn-1 in number )
                    /
    buy1(p,bn) ____/
                   
                    ___________ buy1(p,bn-1)  (as (b,1,b.length) equivalent is bn-1 in number )

因此,对于n=n-1的两个子问题,我们的问题,因此我们的时间函数T(n)如下

   T(n)=2T(n-1)+c (For convenience lets eliminate c as it is very less compared to T(n) for this instance )
   T(n)=2[2(T(n-2))]
   T(n)=2{2[2(T(n-3))]} ===> 2poweri(T(n-i))  -------- equation(1)

当满足基本条件时,重复周期结束。假设T(0)=c(是基本条件),这意味着对于基本条件T(n-i)=T(0)。所以i=n

代入方程(1)中的i值,我们得到2次方(n){t(0)}

因此,我们的时间函数值将是2power(n),并且我们的程序复杂性等于bigoh(2power(n))

您可以使用递归树方法和主方法来查找复杂性。

看看这个,了解更多关于如何解决这个问题的想法。

作为一个额外的练习,尝试使用这个来计算合并排序的复杂性。

有趣的问题。让我们正确地计算它;)因此,当条件(sum==price)永远不会出现时,我们将检查最坏的情况。

首先,让我们检查b.length=1时的完整性。那么您应该在循环中只使用一个"="操作:

for(int i=0;i<b.length;i++)

和2内部初始化:

int sum=0; String stat="IMPOSSIBLE";

下一步。让我们为N计算此任务。首先,您需要在第一个周期内进行N"="操作,在初始化内进行2次操作,在if.内进行2个操作

    stat=buy1(price,Arrays.copyOfRange(b,0,b.length-1));
    stat=buy1(price,Arrays.copyOfRange(b,1,b.length));

另一个操作是在递归步骤中进行的。因此,对于这种情况,我们可以使用递归公式,它等于:

f(n)=4+n+2*f(n-1),f(1)=3

该方程的解为:f(n)=-6+5*2^n-n

所以你们算法的复杂度是指数级的。O(2^n)我忽略了除"="之外的所有其他运算,因为它们不会改变渐近复杂性。

最新更新