繁体   English   中英

大 O 不明白代码是如何 O(log n)

[英]Big O Dont understand how code is O(log n)

嗨,我正在努力理解这个代码片段是如何 O(log n) 的?

 public void method(int n) {
        int i = 1; O(1)
        while(i < n) { - O(N)
            i = i * 2; - O(1)
            instruction(); - O(1)

        }

    }

我计算指令的方式应该是 O(1) i = i * 2 应该是 O(1)? 而 while 循环是我被卡住的地方我把它作为 O(n) 这意味着整个事情是 O(n)

我在哪里感到困惑?

任何帮助,将不胜感激

每次迭代都将i加倍。 最终它将等于 1 * 2 * 2 * 2 * 2...等等。 它将重复直到n大于这种乘法的结果。

这意味着在这种情况下n将大致等于2^x ,其中x是迭代次数。 x是指数),因此,迭代次数等于n 的以 2 为底的 log

要了解循环执行的频率,测试它的几个n值并查看循环数如何变化是有帮助的。

int i = 1;
while(i < n) {
    System.out.println(i);            
    i = i * 2;
}

我添加了一个打印命令来在i的值翻倍之前输出它。
不同n值的输出:

n = 2

1

n = 4

1
2

n = 8

1
2
4

n = 16

1
2
4
8

n = 32

1
2
4
8
16

n = 64

1
2
4
8
16
32

正如你所看到的,循环只运行了n次的 log2。 例如,对于n = 32 ,循环仅运行 5 次。
由于每次迭代后i加倍,它将在n步的 log2 中达到大于或等于n的值。

public void method(int n) {
    int i = 1; O(1)
    while(i < n) { - O(N) => No, you can't say O(N) by just looking at this line
        i = i * 2; - O(1)
        instruction(); - O(1)

    }

}

渐近符号究竟是什么? 它们会告诉您程序/片段的最差运行复杂度。 在这种情况下,如果你想象一下,

  • while 循环运行的次数取决于“n”的值。 所以,总迭代次数肯定是“n”的函数。
  • 每次你将 i 的值加倍。 这意味着,您实际上每次都将迭代总数减少了一半。

让我们数数,假设您有 n = 100。

假设我们在每次迭代结束时打印 i 的值,

2 4 8 16 32 64 128 => 满足终止条件

如果仔细观察,您会发现迭代次数现在类似于“n”的对数函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM