For循环的大O是什么,迭代平方根时代?

时间:2014-01-28 01:42:33

标签: java algorithm big-o computer-science

我正在尝试为此代码片段找到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)?

谢谢!

2 个答案:

答案 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)=1O(√n)

如果是O(√n),则会提供 P(n)=log(n) O(√n.log(n))

[总和的低阶项被另一个吸收。]

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