二分查找:对一个有序的数据集合,查找的思想类似分治思想,每次通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间缩小为0。
使用二分查找实现平方根函数,要求精确到小数点后6位
使用逐次逼近的方法,比如对6求根号,第一次取mid = 3,33 = 9 > 6,那么上限high = 3,第二次取1.5,1.51.5 = 2.25 < 6,那么更新下限 low = 1.5,接着mid = low + (high - low) / 2.0,然后接着更新上限或下限,直到误差在10^(-6)之内,就是得到的值。
/**
* 使用二分查找实现平方根函数,要求精确到小数点后6位
*/
public float sqrt_search(float n){
float mid = 0.0f;
if(n < -1e-6){
// 小于0,抛异常
throw new IllegalArgumentException();
}else if(Math.abs(n) >= -1e-6 && Math.abs(n) <= 1e-6){
return mid;
}else{
// 逐次逼近,默认平方根的不会超过n的一半
float high = n / 2.0f;
float low = 0.0f;
while(Math.abs(high - low) > 1e-6){
// 首先找到中间值
mid = low + (high - low) / 2;
float tmp = mid * mid;
// 比较并更新 high和low
if((tmp - n) > 1e-6){
high = mid;
}else if((tmp -n) < -1e-6){
low = mid;
}else{
return mid;
}
}
}
return mid;
}