Let*_*rus 3 c c++ algorithm big-o
以下代码是O(n)还是O(log n)的Big-O?
for (int i = 1; i < n; i*=2)
sum++;
Run Code Online (Sandbox Code Playgroud)
它看起来像是O(n)还是我完全错过了这个?
ami*_*mit 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
Run Code Online (Sandbox Code Playgroud)
很容易看出,当n加倍时会添加迭代,这是对数行为,而线性行为则是为了不断增加迭代而添加迭代n.
PS(编辑):从 数学角度来说,算法确实是O(n)- 因为大O符号给出渐近上界,并且你的算法渐近"更快"运行O(n)- 所以它确实是O(n)- 但它不是一个紧束缚(它不是Theta(n))我怀疑这实际上是你在找什么.