我正在研究找到原始数字的算法并看到下面的陈述,我不明白为什么。
while (k*k <= n)
优于
while (k <= Math.sqrt(n))
是因为函数调用吗?该调用函数使用更多资源。
更新:正如@Codor所说,我想我需要提一下,k
在内部循环中被更改,而n
未被更改。
因此,如果我之前存储Math.sqrt(n)
并且每次都使用它,它会比每次k*k
倍增效率更高吗?
答案 0 :(得分:3)
显然,对Math.sqrt
的调用使用浮点数学,这可能比乘法中使用的整数数学更昂贵。另一方面,Math.sqrt
只需要对循环进行一次评估,而k*k
的评估需要多次评估。
答案 1 :(得分:2)
让我们看一下迭代的时间复杂度:
removeItemId
O(sqrt(n)*log(n))
O(sqrt(n)) + O(log(n))
但是在编辑时,预先计算的平方根比每次循环时必须进行的乘法更有效。