算法分析:Big-O解释

Algorithm Analysis: Big-O explanation

我目前正在学习 class 算法。以下是我从测验中做错的问题:基本上,我们必须用大 O 表示法表示最坏情况 运行 时间:

int foo(int n) 
 {
    m = 0;
   while (n >=2)
   {
    n = n/4;
    m = m + 1;
   }   
   return m;
 }

我不明白最坏情况的时间为什么不是 O(n)。希望得到解释。谢谢

foo 通过将 n 除以 4 并使用 m 作为计数器计算 n 中 4 的个数来计算 log4(n)。最后,m 将是 n 中 4 的个数。所以它在 m 的最终值中是线性的,它等于 n 的以 4 为底的对数。那么算法就是O(logn),也就是O(n)

让我们假设最坏的情况是 O(n)。这意味着该函数至少需要 n 个步骤。

现在让我们看看循环,n 在每一步都除以 4(或 2²)。因此,在第一次迭代中,n 减少到 n/4,在第二次中,减少到 n/8。它不是线性减少的。它被减少了 2 的幂,所以在最坏的情况下,它的 运行 时间是 O(log n)。

计算可以用递归公式表示:

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,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

吹毛求疵的角落:C int 通常意味着最大值是 2^32 - 1 所以在实践中它只意味着最大 15 次迭代,这当然是 O(1)。不过我觉得你老师的意思真的是O(log(n)).