Big o 这个循环的复杂性很大

Big o 这个循环的复杂性很大,big-o,time-complexity,Big O,Time Complexity,如果我有 int i; for(i = 1; i < n; i *= 2) //n is the size of an array passed to the function { //O(1) code here } inti; for(i=1;i

如果我有

int i;
for(i = 1; i < n; i *= 2) //n is the size of an array passed to the function
{
  //O(1) code here
}
inti;
for(i=1;i
什么是大O复杂性?“i*=2”位让我感到困惑。我尝试过运算计数,但现在我更困惑了。

它看起来像O(log(n)),因为你不是在整个序列上迭代,而是使用两个步骤的幂。

它看起来像O(log(n)),因为你不是在整个序列上迭代,而是使用两个步骤的幂。

复杂度是O(log2(n))

基本上,你的“i”每次迭代都会加倍,所以在1次迭代之后是2,然后是4,然后是8。因此,如果n=28,那么循环将(大约)迭代8次。

复杂性为O(log2(n))


基本上,你的“i”每次迭代都会加倍,所以在1次迭代之后是2,然后是4,然后是8。因此,如果n=28,那么循环将迭代(大约)8次。

每次将步骤减半,因此最终得到O(logn),其中n是总迭代次数。见此:

每次将步骤减半,因此最终得到O(logn),其中n是总迭代次数。请参见:

复杂性是
O(logn)

您可以将循环重写为
for(x=0;pow(2,x)
so
x
。(
pow
应计算
2x

复杂性为
O(logn)

您可以将循环重写为
for(x=0;pow(2,x)
so
x
。(
pow
应该计算
2x

要清楚,这是循环迭代的次数,而不是big-O复杂性。Eric,你能详细说明区别吗?@Ashalynd的答案有big-O复杂性:它是O(log(n))(无基,无减法)。O(log2(N)-1)=O(log2(N))=O(log(N))`(任意基),这个复杂度类的规范代表是
O(log(N))
。事实上,仔细看你的答案,你的复杂度似乎是
log2(N)-log2(N)=0
。谢谢-我做了一些小的修改使它更清楚。更清楚的是,这是循环迭代的次数,而不是大O复杂度。埃里克,你能详细说明区别吗?@Ashalynd的答案有大O复杂度:它是O(log(n))(无基数,无减法)。O(log2(n)-1)=O(log2(n))=O(log(n))`(任意基数),这个复杂度类的典型代表是
O(log(n))
。实际上,仔细看你的答案,你似乎有
log2(n)-log2(n)=0
作为复杂性。谢谢-我做了一些小的编辑以使其更清晰。请看的最后一张幻灯片。请看的最后一张幻灯片。