算法分析:Big-O解释

时间:2016-01-26 04:48:46

标签: algorithm big-o asymptotic-complexity

我正在参加算术课程。以下是我在测验中出错的问题:基本上,我们必须在Big O表示法中指出最坏情况下的运行时间:

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

我不明白这个最坏的情况时间如何不是O(n)。会很感激解释。感谢。

3 个答案:

答案 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)

在最终条件下解决r2 = 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))