以下代码的算法复杂性是什么?

时间:2012-08-20 06:48:04

标签: c++ c algorithm big-o

以下代码O(n)或O(log n)的Big-O是什么?

for (int i = 1; i < n; i*=2)
        sum++;

看起来像O(n)还是我完全错过了这个?

6 个答案:

答案 0 :(得分:10)

它是O(logn),因为i每次都加倍。总的来说,您需要迭代k次,直到2^k = n,在这种情况下,它会在k = logn(从2^logn = n开始)时发生。

简单示例:假设n = 100 - 然后:

iter1: i = 1
iter2: i = 2
iter3: i = 4
iter4: i = 8
iter5: i = 16
iter6: i = 32
iter7: i = 64
iter8: i = 128 > 100

很容易看出,当n加倍时会添加一个迭代,这是对数行为,而线性行为则是为n的不断增加添加迭代。

<强> P.S。 (编辑): 在数学上说,算法确实是O(n) - 因为big-O表示法给出了渐近上界,并且你的算法渐近运行“更快”然后O(n) - 所以它确实是O(n) - 但它不是一个紧束缚(它不是Theta(n))而且我怀疑这实际上是你正在寻找的。 / p>

答案 1 :(得分:3)

复杂度为 O(logn),因为循环运行(log 2 n - 1)次。

答案 2 :(得分:2)

O(log(n)),因为你只循环~log2(n)次

答案 3 :(得分:1)

不是复杂性不是线性的。尝试玩几个场景:这个循环对n = 2,n = 4,n = 16,n = 1024进行了多少次迭代? n = 1024 * 1024怎么样?也许这会帮助你得到正确的答案。

答案 4 :(得分:0)

对于循环检查,运行lg(n)+1次。内循环运行lg(n)次。因此,复杂性是O(lg n),而不是O(log n)。

如果n == 8,以下是代码的运行方式:

  1. I = 1
  2. I = 2
  3. i = 4的
  4. i = 8 - 退出条件

答案 5 :(得分:0)

是O(log(n))。 看看代码num ++; 它循环O(log(n))次。