Big-O和Big-Omega的递归方法

时间:2015-02-06 23:47:01

标签: java recursion big-o

我的任务是尝试找到给定Java方法的big-O和big-Omega,但不知道如何。我知道big-O给出了上限,而大欧米茄给出了下限,但是在查看一个程序而不提一个递归的程序时,我究竟是怎么想出来的呢? 提前谢谢你,这对我的学习有很大的帮助。

public static boolean goal(int i, int n){
    if(n == 0){
        if( i == 91) {
            System.out.println("i = " + i +", DONE!!!");
            return true;
        }
        else {
            return false;
        }

    }
    else if(i % 2 == 1){
        if(goal(i + 53,n - 1))
        {
            System.out.println("i = "+ i + ", step # " + n);
            return true;
        }
        else
            return false;
    }
    else {
       if( goal(i + 53,n - 1) || goal(i / 2,n - 1))
       {
            System.out.println("i = "+ i +", step # " + n);
            return true;
       }
       else
            return false;
    }
}

2 个答案:

答案 0 :(得分:0)

每次递归迭代你将n递减1,当N达到0时递归停止,在最好的情况下,你总是奇数,所以你进入第一个分支,所以这个算法的下限是 O (N)

上限是最坏的情况,是你的最后一个else分支,当你可以调用goal两次,所以上限将是 O(2 ^ N)

答案 1 :(得分:0)

goal(i,n)会在每次调用时减少n

最佳案例

i总是很奇怪。然后goal()每次只进行一次(至少一次)递归调用,你得到

T(n) = T(n-1) + Ω(1),           T(0) = Ω(1)

加起来为Ω(n)

最坏情况

i始终是平等的。然后goal()最多只能进行两次递归调用,然后得到

T(n) = 2⋅T(n-1) + O(1),         T(0) = O(1)

这加起来

Σk=0,...,n 2k⋅O(1) = 2n+1⋅O(1) = O(2ⁿ)

注意:这不是很精确。例如。如果i是奇数,则它甚至在下一个呼叫中。如果i为偶数且goal(i + 53,n - 1)评估为true,则不会调用goal(i / 2,n - 1)。所以也许我们可以证明更好的上限和下限。