我正在尝试为此代码片段找到Big O:
for (j = 0; j < Math.pow(n,0.5); j++ ) {
/* some constant operations */
}
由于循环运行√n次,我假设这个for循环是O(√n)。但是,我在网上读到√n= O(logn)。
这对于循环O(√n)还是O(logn)?
谢谢!
答案 0 :(得分:8)
必须做出几个假设,但这个循环的时间复杂度似乎是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 */
}
(仅当正文不更改n
时,这是有效的重构。)
答案 1 :(得分:0)
假设某个函数pow
的{{1}}操作的开销为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.log(n))
。
[总和的低阶项被另一个吸收。]
假设O(√n)
在任意精度整数的上下文中都是有效的,其中整数P(n)=log(n)
的表示至少需要n
位。但这仅适用于O(log(n))
的巨大价值。