Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.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符号请解释O(log2n)_Java_For Loop_Big O - Fatal编程技术网

Java 大O符号请解释O(log2n)

Java 大O符号请解释O(log2n),java,for-loop,big-o,Java,For Loop,Big O,我很难理解为什么这段代码的大O符号是O(log2^n): for (int i = n; i>=1; i=i/2){ sum = i+j; } 我以为是O(n)这是O(log_2n)。因为它将一直运行,直到n变为1 在第k步之后,假设所有的事情都变成1 所以n/2^k=1 k=log\u 2 n 复杂性是O(log_2 n)简单答案: 正如@coderredoc解释的,这个代码片段是O(logn)。对数的底在渐近符号中是无关紧要的,因为它只对常数产生差异 深入回答: 如果这是在学

我很难理解为什么这段代码的大O符号是O(log2^n):

for (int i = n; i>=1; i=i/2){
    sum = i+j;
}
我以为是O(n)

这是
O(log_2n)
。因为它将一直运行,直到
n
变为1

在第k步之后,假设所有的事情都变成1

所以
n/2^k=1

k=log\u 2 n

复杂性是O(log_2 n)简单答案:

正如@coderredoc解释的,这个代码片段是O(logn)。对数的底在渐近符号中是无关紧要的,因为它只对常数产生差异

深入回答: 如果这是在学术背景下提出的;然后请阅读更多关于大O表示法和大Θ表示法之间的区别。


对于您的特定问题,任何O(logn)的代码理论上都可以称为O(2^n)或O(n)或O(log2^n)。因为,big-O符号描述的是上界,而不是紧界

什么部分令人困惑?注意,
i=i/2
?@ElliottFrisch我看到for循环,我认为它应该是0(n)。我没有得到for循环中I=I/2的重要性。我知道我被2除(for循环中的每个循环都被2除吗?@sukiyo:I
I
每次通过循环都被2除,所以如果
I
开始为1024,那么它将是512、256、128、64、32、16、8、4、2、1,然后是0(因为整数除法),此时循环退出。因此,每次
n
增加一倍,在循环退出之前,您将获得1次迭代。这是n的
log(base 2)的定义。n/2^k是i=i/2部分吗?@sukiyo.:是的,在每一步中,基本上都是n除以2。你说对了它去哪里了?在每次迭代中,n的值(存储在
i
中)都会减小..就像在
开始时i=n,然后i=n/2,然后i=n/4,然后i=n/8…
@sukiyo是的
log\u 2n
是以
2
为基数的
log\u 2n
我认为使用
lg n
log2n
符号会更清楚。Log表示以10为基数的Log。Ln表示对数基数e