Java For循环的大O是多少,迭代的平方根时间?

Java For循环的大O是多少,迭代的平方根时间?,java,algorithm,big-o,computer-science,Java,Algorithm,Big O,Computer Science,我正试图找到这个代码片段的大O: for (j = 0; j < Math.pow(n,0.5); j++ ) { /* some constant operations */ } for(j=0;j

我正试图找到这个代码片段的大O:

for (j = 0; j < Math.pow(n,0.5); j++ ) {
 /* some constant operations */
}
for(j=0;j
因为循环运行时间为√n次,我假设这个for循环是O(√n) 。然而,我在网上看到√n=O(logn)

这是循环O的吗(√n) 还是O(logn)


谢谢

我们必须做出几个假设,但这个循环的时间复杂性似乎是O(√n) 。这些假设是:

  • 无论
    j
    的值如何,循环体都以恒定时间执行
  • j
    未在循环体中修改
  • 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 */
}
double limit=Math.pow(n,0.5);
对于(j=0;j

(只有当主体不改变时,这才是有效的重构)

假设
pow
操作的成本为
O(p(n))
对于某些函数
p
,循环的全局成本为
O(√n、 P(n))
。如果
pow
调用从循环中取出并且只执行一次,则成本表示为
O(√n+P(n))

p(n)=1的情况下,这分别给出
O(√n) 
O(√n) 

如果
p(n)=log(n)
,这将给出
O(√n、 日志(n))
O(√n) 

[金额的低阶项由另一方吸收。]


假设
p(n)=log(n)
可以在任意精度整数的上下文中有效,其中整数
n
的表示至少需要
O(log(n))
位。但这仅适用于
n
的巨大值。

√n=O(logn)
太愚蠢了。你在哪里读到的?显然,循环将运行
O(sqrt(n))
次。您在哪里读到的√n=O(logn)?当然可以(√n) !=O(logn)自√n!=日志(n)。也许这意味着要计算的是某种算法√n是O(logn)请提供显示O的链接(√n) =O(logn)。事实上(√n) >O(logn)表示大n。所以这个for循环只有O(√n) ?是的,假设
j-0
是一个打字错误(应该是
j=0
),Java本身就不能做这种优化吗?!我希望它至少在
n
是一个局部变量的情况下对此进行优化,但也许我错了。@NiklasB.-这对编译器要求很高。它不仅必须能够确定
n
没有改变值(声明它
final
会有帮助),而且编译器还必须知道
Math.pow(n,0.5)
每次使用相同的参数调用它时都返回相同的值。我认为编译器没有完整的标准API的详细模型。是的,如果循环说
j*j
而不是
j
,一切都会更好。让整数为整数,浮点数为浮点数。@David:j*j