我正在参加算术课程。以下是我在测验中出错的问题:基本上,我们必须在Big O表示法中指出最坏情况下的运行时间:
int foo(int n)
{
m = 0;
while (n >=2)
{
n = n/4;
m = m + 1;
}
return m;
}
我不明白这个最坏的情况时间如何不是O(n)。会很感激解释。感谢。
答案 0 :(得分:2)
foo
通过将n
除以4来计算log4(n),并使用n
作为计数器计算m
中的4&#4。最后,m
将是n
中的4个数字。因此它在m
的最终值中是线性的,它等于n
的对数基数4。然后算法O(logn)
,也是O(n)
。
答案 1 :(得分:1)
让我们假设最坏的情况是O(n)。这意味着该功能至少需要n步。
现在让我们看看循环,n在每一步被除以4(或2)。因此,在第一次迭代中,n减小到n / 4,在第二次迭代中减少到n / 8。它没有线性减少。它被减少了2的幂,所以在最坏的情况下,它的运行时间是O(log n)。
答案 2 :(得分:0)
计算可以表示为递推公式:
f(r) = 4*f(r+1)
解决方案是
f(r) = k * 4 ^(1-r)
其中^表示指数。我们可以说f(0) = n
所以f(r)= n * 4 ^( - r)
在最终条件下解决r
:2 = n * 4^(-r)
使用双方登录,log(2) = log(n) - r* log(4)
我们可以看到
r = P * log(n);
没有更多的分支或内部循环,假设分割和添加是O(1)
我们可以自信地说算法,运行P * log(n)
步骤因此是O((log(n))
。
http://www.wolframalpha.com/input/?i=f%28r%2B1%29+%3D+f%28r%29%2F4%2C+f%280%29+%3D+n
Nitpickers转角:C
int通常意味着最大值为2^32 - 1
,所以在实践中它只意味着最大15
次迭代,当然是O(1)。但我认为你的老师真的意味着O(log(n))
。