[英]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)
}
}
渐近符号究竟是什么? 它们会告诉您程序/片段的最差运行复杂度。 在这种情况下,如果你想象一下,
让我们数数,假设您有 n = 100。
假设我们在每次迭代结束时打印 i 的值,
2 4 8 16 32 64 128 => 满足终止条件
如果仔细观察,您会发现迭代次数现在类似于“n”的对数函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.