我的任务是尝试找到给定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;
}
}
答案 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)
。所以也许我们可以证明更好的上限和下限。