Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.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
Java 给定代码片段的大O表示法_Java_Time Complexity_Big O - Fatal编程技术网

Java 给定代码片段的大O表示法

Java 给定代码片段的大O表示法,java,time-complexity,big-o,Java,Time Complexity,Big O,我正在寻找一些关于大O符号的帮助。目标是给出给定代码片段的增长顺序 int sum = 0 for (int k = n; k > 0; k/=2 ) for (int i = 0; i < k; i++) sum++; int和=0 对于(int k=n;k>0;k/=2) for(int i=0;i

我正在寻找一些关于大O符号的帮助。目标是给出给定代码片段的增长顺序

int sum = 0
for (int k = n; k > 0; k/=2 )
  for (int i = 0; i < k; i++)
    sum++;
int和=0
对于(int k=n;k>0;k/=2)
for(int i=0;i
对于这个代码片段,我得到了(N logN)。第一个for循环是logN,第二个for循环是N

int sum = 0
for (int i = 1; i < n; i *= 2 )
  for (int j = 0; j < i; j++)
    sum++;
int和=0
对于(int i=1;i
我在这件事上遇到了一些麻烦。第一个for循环是logN,但是第二个for循环是我被卡住的地方。中的第二个for循环依赖于第一个for循环。我不知道如何用大N表示法来表示

int sum = 0
for (int i = 1; i < n; i *= 2 )
  for (int j = 0; j < n; j++)
    sum++;
int和=0
对于(int i=1;i
第一个for循环是logN。第二个for循环是N,那么这是(N)

我正在努力解决这个问题,希望能得到一些帮助。多谢各位

  • 第一个代码片段是正确的:O(n*logn)

  • 在第二个代码片段中,
    j
    循环到
    i
    ,它可以高达
    n-1
    ,因此
    循环的
    j
    本身就是O(n)。但让我们看看会发生什么

    • n=16
    • i=1内部循环运行1次
    • i=2内部循环运行2次
    • i=4内部循环运行4次
    • i=8内部循环运行8次

    • n=17

    • i=1内部循环运行1次
    • i=2内部循环运行2次
    • i=4内部循环运行4次
    • i=8内部循环运行8次
    • i=16内部循环运行16次
  • 循环的计数为

    1 + 2 + 4 + ... + 2^x = 2^(x+1) - 1
    
    其中x是
    n
    之前的2的幂。这个
    2^(x+1)
    可能高达2n,因此总体复杂度为O(n),去掉了常量“2”

  • 第三个代码片段与第二个代码片段相似;每次只有
    j
    一直到
    n
    。这里的复杂性是O(n*logn)

  • 最后一个示例仍然是N*logN。您必须执行N次操作log N次,因此,您得到N*log N。第二次内部运行不是每次都运行到
    i-1
    ,从而使其成为
    N(N+1)/2
    ?对不起,由于外部原因,不是
    n
    ;这必须根据日志进行调整。@Chieftwoils这是不正确的,但我最初对第二个片段的分析也是不正确的。我现在已经改正了。