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

时间:2012-09-12 06:52:58

标签: java algorithm time-complexity

我刚刚开始解决Topcoder算法问题,并在Java中为SRM 466 Div 2 LotteryTicket问题编写了这个算法。

由于我不熟悉时间复杂度,所以如果有人能解释我如何逐步计算这个算法的时间复杂度。

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;
}

3 个答案:

答案 0 :(得分:5)

对于您的情况,重复关系是 (让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 = 2的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).so i = n

在等式(1)中代入i值,我们得到2power(n){t(0)}

所以我们的时间函数值将是2power(n),我们的程序复杂度等于bigoh(2power(n))

答案 1 :(得分:2)

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

检查this以获取有关如何解决此问题的更多建议。

作为一项额外练习,请尝试使用此计算合并排序的复杂性。

答案 2 :(得分:2)

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

首先让我们在b.length = 1时检查complecity。然后你应该在循环中只使用一个“=”操作:

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

2内部初始化:

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

下一步。让我们为N计算这个任务。 首先,您需要在第一个循环内部执行N“=”操作,在内部初始化中执行2个内部操作,在内部执行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)的 我忽略了所有其他操作,除了“=”,因为它们不会改变渐近的复杂性。