Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何找到这段代码的时间复杂度(大O)?_C++_C_Big O - Fatal编程技术网

C++ 如何找到这段代码的时间复杂度(大O)?

C++ 如何找到这段代码的时间复杂度(大O)?,c++,c,big-o,C++,C,Big O,我试图理解O符号是如何工作的,我在下面有一段代码,在每一行旁边我都会有一个我认为时间复杂度很高的注释。如果我错了,请纠正我,并解释为什么我的逻辑不正确 代码#1 对于(inti=0;i

我试图理解O符号是如何工作的,我在下面有一段代码,在每一行旁边我都会有一个我认为时间复杂度很高的注释。如果我错了,请纠正我,并解释为什么我的逻辑不正确

代码#1

对于(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);
                }
          }