【发布时间】:2017-09-25 10:35:53
【问题描述】:
Babylonian aka Heron 的方法似乎是寻找数字 n 平方根的更快算法之一。它收敛的速度取决于您最初猜测的距离。
现在随着数字 n 的增加,它的根 x 随着百分比的减少而增加。
根(10):10 - 31%
10:100 - 10%
根(100) : 100 - 3%
根(1000) : 1000 - 1%
所以基本上对于数字中的每个数字除以 3 左右。然后用它作为你的初始猜测。比如——
public static double root(double n ) {
//If number is 0 or negative return the number
if(n<=0)
return n ;
//call to a method to find number of digits
int num = numDigits(n) ;
double guess = n ;
//Divide by 0.3 for every digit from second digit onwards
for (int i = 0 ; i < num-1 ; ++i )
guess = guess * 0.3;
//Repeat until it converges to within margin of error
while (!(n-(guess*guess) <= 0.000001 && n-(guess*guess) >= 0 )) {
double divide = n/guess ;
guess = Math.abs(0.5*(divide+guess)) ;
}
return Math.abs(guess) ;
}
这是否有助于优化算法。这是 O(n) 吗?
【问题讨论】:
-
求位数的函数是十进制对数函数;实际上,它的 1+ 该数字的十进制对数的整数部分
-
另外,不要像这样迭代:
for (int i = 0 ; i < num-1 ; ++i ) guess = guess * 0.3;,这会增加复杂性,您可以这样做guess=guess* Math.pow(0.3, num-1) -
这是一个非常糟糕的收敛条件,它根本没有考虑数字的大小,所以它只能在特定的输入范围内工作。
-
@Newtonfan01 - 我知道它是 log10,最初使用的是 Math.log10() 方法。但是我将其切换为使用模数来计算位数的简单方法,因为我认为找到确切的日志需要更多时间?
标签: java algorithm square-root