Java 递归方法的大O和大Omega
我的任务是试图找到给定Java方法的big-O和big-Omega,但不知道如何找到。我知道big-O给出了上界,big-Omega给出了下界,但是当我看一个程序时,更不用说递归程序了,我该如何准确地理解这个呢? 提前谢谢你,这将对我的学习大有帮助Java 递归方法的大O和大Omega,java,recursion,big-o,Java,Recursion,Big O,我的任务是试图找到给定Java方法的big-O和big-Omega,但不知道如何找到。我知道big-O给出了上界,big-Omega给出了下界,但是当我看一个程序时,更不用说递归程序了,我该如何准确地理解这个呢? 提前谢谢你,这将对我的学习大有帮助 public static boolean goal(int i, int n){ if(n == 0){ if( i == 91) { System.out.println("i = " + i +"
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;
}
}
每次递归迭代,当n减1,递归在n达到0时停止,在最好的情况下,你的i总是奇数,所以你进入第一个分支,所以这个算法的下界是O(n) 上限是最坏的情况,是您最后的
else
分支,当您可以调用goal
两次时,上限将是O(2^N)goal(i,N)
在每次调用它时减少N
最佳案例
i
总是很奇怪。然后,goal()
每次只进行一次(至少一次)递归调用,您将获得
T(n) = T(n-1) + Ω(1), T(0) = Ω(1)
T(n) = 2⋅T(n-1) + O(1), T(0) = O(1)
加起来等于Ω(n)
最坏情况
i
总是偶数。然后goal()
每次最多进行两次递归调用,得到
T(n) = T(n-1) + Ω(1), T(0) = Ω(1)
T(n) = 2⋅T(n-1) + O(1), T(0) = O(1)
这意味着
Σk=0,...,n 2k⋅O(1) = 2n+1⋅O(1) = O(2ⁿ)
∑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)
没有被调用。所以也许我们可以证明更好的上限和下限。你有教科书吗?99%以上的时间,答案都在教科书中。这就是它的目的。