为什么k * k <= n优于k <= Math.sqrt(n)

时间:2018-04-16 05:06:27

标签: algorithm

我正在研究找到原始数字的算法并看到下面的陈述,我不明白为什么。

while (k*k <= n) 

优于

while (k <= Math.sqrt(n))

是因为函数调用吗?该调用函数使用更多资源。

更新:正如@Codor所说,我想我需要提一下,k在内部循环中被更改,而n未被更改。

因此,如果我之前存储Math.sqrt(n)并且每次都使用它,它会比每次k*k倍增效率更高吗?

2 个答案:

答案 0 :(得分:3)

显然,对Math.sqrt的调用使用浮点数学,这可能比乘法中使用的整数数学更昂贵。另一方面,Math.sqrt只需要对循环进行一次评估,而k*k的评估需要多次评估。

答案 1 :(得分:2)

让我们看一下迭代的时间复杂度:

  • i = 2 .. i * iO(sqrt(n))
  • i = 2 .. sqrt(n)removeItemId
  • i = 2 .. sqrt(按牛顿方法)O(sqrt(n)*log(n))
  • i = 2 .. sqrt(通过Math.sqrt)O(sqrt(n)) + O(log(n))

但是在编辑时,预先计算的平方根比每次循环时必须进行的乘法更有效。