二分查找法
简介
1,二分查找法,就相当是在循环中边比较边排除的一种搜索定位的方法,循环次数比我们平时的逐步搜索少,性能高
2,简单来讲,就是在必须是有序的序列中,寻找某个值,通过一分为二的比较排除,减少比较次数
3,每次排除都把所有的情况分成"可能"和"不可能"两种,然后抛弃所有"不可能"的情况.
代码实现
因为二分查找,也是在循环中比较查找,所以一定少不了循环。
首先就会想到用循环和递归(其实递归本质上也是一种循环)。
在不断的循环比较中,$min和$max会越来越接近,到最后达到一致或者违背序列。这个也正好就是循环条件或者递归条件
核心就是在每次比较之后对$min,$max,$mid的处理。
代码示例
<?php
header('content-type:text/html;charset=utf-8');
//二分查找法
$test_arr = array(1,2,4,5,6,7,8,9,13,35,46,67,79,123,345,567,678,879);
echo "<pre>";
print_r($test_arr);
//**方法1,循环**
function binarySearch($arr,$target)
{
$min = 0;
$max = count($arr)-1;
while($arr[$min]<=$arr[$max])
{
$mid = floor(($min+$max)/2);
if($arr[$mid] == $target){
return $mid;
}elseif($arr[$mid] < $target){
$min = $mid+1;
}else{
$max = $mid-1;
}
}
return '数组不符合条件';
}
//方法2,递归
function binarySearchRecursion(&$arr,$min,$max,$target)
{
if($arr[$min] <= $arr[$max]){
$mid = floor(($min+$max)/2);
if($arr[$mid] == $target){
return $mid;
}elseif($arr[$mid] < $target){
return binarySearchRecursion($arr,$mid+1,$max,$target);
}else{
return binarySearchRecursion($arr,$min,$mid-1,$target);
}
}
}
$res = binarySearchRecursion($test_arr,0,17,5);
echo $res;
?>
总结:
其实递归的方法可以不要$min,$max参数,在比较完成后直接把数组处理后传入即可。
复习:
array_slice() //取出一段
array_splice() //去掉一部分并且用其他的替代
array_chunk() //分割
floor() //四舍五入