我在处理Big-O表示法时使用了这个示例
x=n
while(x>0)
{
y=x
while(y>0)
{
y=y-1
}
x = x/2
}
您能解释一下为什么它似乎具有O(N)复杂性吗?
这对我来说是新的,但我希望它是N LogN。
我想念什么?
谢谢
答案 0 :(得分:2)
好吧,让我们看看内部循环的主体执行的频率:
x = n: n
x = n / 2: n / 2
x = n / 4: n / 4
x = n / 8: n / 8
x = n / 16: n / 16
x = n / 32: n / 32
x = n / 64: n / 64
until x < 1
或将它们放在一起:
n + n / 2 + n / 4 + n / 8 + n / 16 + n / 32 + n / 64 ...
容易看到的与:
n + n - n / 64
现在我们需要一个上限,因此我们可以忽略最后一项。对于大哦,常数也无关紧要。所以:
O(n)
答案 1 :(得分:2)
如果您发现内部循环运行了多少次,则会发现代码的复杂性。内部循环运行n + n / 2 + n / 4 + ... n / k(其中n / k> 0)次。 n / 2 + n / 4 + ... + n / k部分的最大值为n-1。因此,代码不能运行超过2n-1次,使上限2n-1为O(n)