二分查找法
工作原理
一、流程图

二、原理
第一步:我们选取目标数和基准值
$arr = [1,2,3,4,5,6,7,8,9]; $mind = ceil(($start+$end)/2);
第二步:判断当前要查找的值是否是基准值,是就直接返回下标;不是在判断是不是基准值的左边或右边,如果不存在,数组继续选取,直到找到为止返回下标。
图解

注意:
1、二分查找法一定是排好序的,才能使用二分查找;
源代码
一、递归的方式实现
<?php
function search($arr, $key, $start, $end)
{
if($start > $end) return false;
$mid = intval(ceil(($start + $end) / 2));
if($arr[$mid] < $key){
return search($arr, $key, $mid + 1, $end);
}elseif($arr[$mid] > $key){
return search($arr, $key, 0, $mid - 1);
}else{
return true;
}
}
function find ($target, $array)
{
foreach ($array as $key => $value) {
$len = count($value) - 1;
$res = search($value, $target, 0, $len);
if(!$res){
continue;
}else{
return true;
}
}
return false;
}
$arr = [[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]];
find(5, $arr);
二、迭代的方式实现
function binSearch($arr, $key){
$start=0;
$end=count($arr)-1;
while($start <= $end){
$mid = ceil(($start+$end)/2);
if($arr[$mid] < $key){
$start = $mid+1;
}else if($arr[$mid] > $key){
$end = $mid-1;
}else{
return $mid;
}
}
}
$arr = [1,2,3,4,5,6,7,8,9];
$len = count($arr) - 1;
$data = binSearch($arr, 5, 0, $len);
var_dump($data);
性能分析
| 查找算法 | 时间复杂度 | 空间复杂度 | 稳定性 | ||
| 平均情况 | 最坏情况 | 最好情况 | |||
| 二分查找法 | O(log2n) | O(n) | O(log2n) | O(1)-O(log2n) | 稳定 |

浙公网安备 33010602011771号