以下代码O(n)或O(log n)的Big-O是什么?
for (int i = 1; i < n; i*=2)
sum++;
看起来像O(n)还是我完全错过了这个?
答案 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,以下是代码的运行方式:
答案 5 :(得分:0)
是O(log(n))。 看看代码num ++; 它循环O(log(n))次。