我正在尝试找出这段代码的时间复杂度(Big O):
for (j = 0; j < Math.pow(n,0.5); j++ ) {
/* some constant operations */
}
自循环运行次数为√n,因此我假设这个for循环的时间复杂度为O(√n)。然而,我在网上阅读到 √n = O(logn)。
所以,这个for循环的时间复杂度是O(√n)还是O(logn)?
谢谢!
我正在尝试找出这段代码的时间复杂度(Big O):
for (j = 0; j < Math.pow(n,0.5); j++ ) {
/* some constant operations */
}
需要做出几个假设,但是这个循环的时间复杂度似乎为O(√n)。这些假设如下:
Math.pow(n,0.5)
在恒定时间内执行 (可能为真,但取决于具体的Java执行环境)正如一条评论所指出的那样,这也假设循环初始化是j=0
而不是j-0
。
请注意,如果重写循环,循环的效率将会更高:
double limit = Math.pow(n, 0.5);
for (j = 0; j < limit; j++ ) {
/* some constant operations */
}
n
是一个局部变量,我希望它至少会进行优化,但也许我是错的。 - Niklas B.Math.pow
会始终返回相同的值,即使参数相同(如果这是你想问的)。 - Sotirios Delimanolisn
没有改变值(将其声明为 final
会有所帮助),而且编译器还需要知道每次使用相同参数调用 Math.pow(n,0.5)
时返回相同的值。我认为编译器没有整个标准 API 的如此详细的模型可用。 - Ted Hoppj * j < n
而不是j < Math.pow(n, 0.5)
,那么一切都会更好。让整数保持整数,浮点数保持浮点数。 - Dawood ibn Kareempow
操作的成本为O(P(n))
,那么循环的全局成本为O(√n.P(n))
。如果将pow
调用从循环中分离出来,仅执行一次,则成本表达式为O(√n+P(n))
。P(n)=1
,则它们分别为O(√n)
和O(√n)
。P(n)=log(n)
,则它们分别为O(√n.log(n))
和O(√n)
。P(n)=log(n)
,在任意精度整数的情况下可能是有效的,其中表示整数n
至少需要O(log(n))
位。但这只有在处理大值n
时才有意义。
n
在循环过程中没有变化 :) :) - ajb