二分查找
二分查找也称折半查找,是一种在有序数组中查找某一特定元素的搜索算法。从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜 素过程结束; 如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组 为空,则代 表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。折半搜索每次把搜索区域减少一半,时间复杂度为Ο(logn)。
PHP代码实现:
function bin_search($arr, $low, $high, $key){
if ($low <= $high) {
$mid = intval(($low + $high) / 2);
if ($arr[mid] == $key){
return mid;
}
else if ($arr[mid] > $key){
return bin_search($arr, $low, $mid-1, $key);
}
else {
return bin_search($arr, $mid+1, $high, $key);
}
}
return -1;
}
实现一个函数,完成开根号的操作,不能调用系统库函数, 诸如Math.sqrt(v) 之类的,举例,:sqrt(9, 0.21)返回值属于 [2.79, 3.21] 这个区间的任意一个都满足条件。
最容易想的方法是暴力搜索,用一个循环,每次r += t(t为允许误差),直到r的平方大于等于v。
这个方法理论上是一个可行的方法,不过当要求误差很小且v值很大的时候会效率很低。可以想一些优化的方法,例如,不断修改步长来增大接近真实值的速度。
可以借用二分查找的思想来解此题,不过需要注意结束条件。
(r减v的开根小于t )和 (r的平方减v小于t)是不一样的。