所以我有一个数据结构和大O分析的功课,而big-O对我来说仍然是一个非常新的概念所以我仍然试图抓住它。在其中一个问题中,我被告知要找到以下代码的最坏情况运行时间的重现:
g(n){
if(n == 1){
return 1000;
}
if(g(n/4) > 6){
return 6 * g(n/4);
}
else{
return 4 * g(n/4);
}
}
我对如何解决这个问题感到茫然!我认为最好的情况可能是O(1),即如果n立即为1则会返回1000并且代码结束。但我不知道如何解决最坏情况的运行时!我是否需要关注第二个if语句和else,假设g(n / 4)>将需要相当长的时间。 6?
如果有人对此有任何见解,我将非常感谢...谢谢!
答案 0 :(得分:0)
Big O符号只关注运行时间的渐近增长。
所以最好的情况不是O(1)
,因为这只适用于固定的n
。
如果查看代码,您会注意到n > 1
的每个案例都会调用g(n/4)
。因此,如果n
大于1
,则除以4
(调用两次,一次评估g(n/4) > 6
,一次评估g(n/4)
) 。时间递推方程是
T(n) = 2⋅T(n/4) + Θ(1)
您可以将其扩展为
T(n) = T(n/4c) + Σk=1,...,c 2c⋅Θ(1)
此终止为n / 4c = 1
或n = 4c
。这适用于c = log₄(n)
,你得到
T(n) = Θ(1) ⋅ (2 + 4 + ... + 2log₄(n)) = 20.5⋅log₂(n) + 1 - 2 = 2⋅(sqrt(n) - 1) = Θ(sqrt(n))
或者,您可以使用master theorem。
注意:您发布的代码具有相同的最佳案例复杂性和最差案例复杂性。