C++ 如何找到这段代码的时间复杂度(大O)?
我试图理解O符号是如何工作的,我在下面有一段代码,在每一行旁边我都会有一个我认为时间复杂度很高的注释。如果我错了,请纠正我,并解释为什么我的逻辑不正确 代码#1C++ 如何找到这段代码的时间复杂度(大O)?,c++,c,big-o,C++,C,Big O,我试图理解O符号是如何工作的,我在下面有一段代码,在每一行旁边我都会有一个我认为时间复杂度很高的注释。如果我错了,请纠正我,并解释为什么我的逻辑不正确 代码#1 对于(inti=0;i
对于(inti=0;iO(lgj)
,其中j是O(n)
,因此k是O(lgn)
。但是如果你考虑整个程序,它是O(nlgn)
k的块是O(lgj)
,其中j是O(n)
,所以k是O(lgn)
。但是如果你考虑整个程序,它是O(n lg n)以下是规则:
- 循环是迭代次数乘以实体的复杂性
- 连续块是复杂度的总和
- 但在O()中,只有渐近最大项是相关的,因此可以立即简化为更高的复杂性
- 乘法常数是不相关的
- 几何级数(带有
j=j*2的
循环和带有j
k=k/2的
循环)具有复杂性k
O(logn)
- 循环是迭代次数乘以实体的复杂性
- 连续块是复杂度的总和
- 但在O()中,只有渐近最大项是相关的,因此可以立即简化为更高的复杂性
- 乘法常数是不相关的
- 几何级数(带有
j=j*2的
循环和带有j
k=k/2的
循环)具有复杂性k
O(logn)
- 以下是规则:
k=k/2
循环的时间复杂度提示:在到达2
之前,您可以将(2^x)
除以2
多少次?@user3718584:Corect<代码>x。现在你如何从n=2^x
到x
?在我们继续之前,他是从哪里想到2^x/2的?对他的暗示感到困惑。在代码中使用注释而不是@user3718584过去的经验有什么不对。而且,如果您以2
结束,在除以2
之后,您必须从2^x
附近的某个地方开始。。。或者类似的东西。关于k=k/2
循环的时间复杂度提示:在到达2
之前,您可以将(2^x)
除以2
多少次<代码>x
。现在你如何从n=2^x
到x
?在我们继续之前,他是从哪里想到2^x/2的?对他的暗示感到困惑。在代码中使用注释而不是@user3718584过去的经验有什么不对。而且,如果您以2
结束,在除以2
之后,您必须从2^x
附近的某个地方开始。。。或者类似的东西。对于时间复杂度,近似值几乎是我们真正需要的。实际上O(n-2)=O(n)。对吧,因为我们去掉了常数?为什么在其他例子中,它们只是把常数留在那里呢?j块也是O(logn)。只要你愿意。如果你坚持,就不会让你错。但是写起来有点琐碎。(在O形符号的背景下)@BenjaminLindley哦,是的,我明白了。我没有注意增量。实际上O(n-2)=O(n)。对,因为我们去掉了常数?为什么在其他例子中,它们只是把常数留在那里呢?j块也是O(logn)。只要你愿意。如果你坚持,就不会让你错。但是写起来有点琐碎。(在O形符号的背景下)@BenjaminLindley哦,是的,我明白了。我没有注意到增量。@JaviV:是的,输入错误。谢谢。总的运行时间是多少?@JaviV:是的,输入错误。谢谢。总运行时间是多少?
for (int i = 0; i < n; i++) <<<<<<<<<<<<<<<<<<< O(1)*O(N)
{
for (int j = 0; j < 3; j++) <<<<<<<<<<<<<<< O(1)*O(1)
{
for (int k = 0; k < 3; k++) <<<<<<<<<<<<<<O(1)*O(1)
{
printf("%d", arr[i]); <<<<<<<<<<<<<<O(1)
}
printf("\n"); <<<<<<<<<<<<<<<<<<O(1)
}
}
for (int i = 2; i <= n; i++) <<<<<<<<<<<<O(1)*O(N)
{
int j;<<<<<<<<<<<<<<<<<<<<<<<O(1)
printf("\n%d:", i);<<<<<<<<<<<<<<O(1)
for(j = 2; j <= i; j = j * 2) <<<<<<<<<<<O(n-2)??????????
{
printf("%d ", j);<<<<<<<<<<<<<<O(1)
}
printf("\n%d:", i);<<<<<<<<<<<<<<<<<<<<O(1)
for(int k = j/2; k >= 2; k = k / 2)<<<<<<<<<<<<<I am not sure of this one
{
printf("%d ", k);
}
}