Java For循环的大O是多少,迭代的平方根时间?
我正试图找到这个代码片段的大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
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
以恒定时间执行(可能是真的,但取决于特定的Java执行环境)Math.pow(n,0.5)
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