二进制搜索(二分查找)是一种高效的搜索算法,适用于已排序的数组或列表。其核心思想是通过不断缩小搜索范围,将查找时间从线性降低到对数级别。以下是使用二进制搜索的详细步骤及实现方法:
一、基本步骤
排序前提 :二分搜索仅适用于已排序的数组或列表。初始化范围:
设定搜索区间的起始索引`low`为0,结束索引`high`为数组长度减1。
迭代查找
- 计算中间索引`mid = floor((low + high) / 2)`;
- 比较目标值与中间元素:
- 若相等,返回`true`;
- 若目标值小于中间元素,更新`high = mid - 1`;
- 若目标值大于中间元素,更新`low = mid + 1`;
- 重复上述步骤,直到`low`超过`high`,表示未找到目标值,返回`false`。
二、递归实现
递归版本通过函数自身调用来缩小搜索范围,代码结构更简洁:
```php
function binarySearchRecursive($arr, $low, $high, $x) {
if ($low > $high) return false;
$mid = floor(($low + $high) / 2);
if ($arr[$mid] == $x) return true;
return $x < $arr[$mid] ? binarySearchRecursive($arr, $low, $mid - 1, $x) : binarySearchRecursive($arr, $mid + 1, $high, $x);
}
```
三、PHP内置函数
PHP提供了便捷的二分搜索函数:
`array_binary_search($arr, $x)`:返回目标值在排序数组中的索引,若不存在则返回`false`。
四、注意事项
数据类型:
二分搜索仅适用于数字或可比较的字符串(如ASCII字符);
效率:时间复杂度为O(log N),显著优于线性搜索(O(N))。
五、示例代码
以下是迭代和递归两种实现方式的完整代码示例:
```php
// 迭代版
function binarySearchIterative($arr, $x) {
$low = 0;
$high = count($arr) - 1;
while ($low <= $high) {
$mid = floor(($low + $high) / 2);
if ($arr[$mid] == $x) return true;
if ($x < $arr[$mid]) $high = $mid - 1;
else $low = $mid + 1;
}
return false;
}
// 递归版
function binarySearchRecursive($arr, $low, $high, $x) {
if ($low > $high) return false;
$mid = floor(($low + $high) / 2);
if ($arr[$mid] == $x) return true;
return $x < $arr[$mid] ? binarySearchRecursive($arr, $low, $mid - 1, $x) : binarySearchRecursive($arr, $mid + 1, $high, $x);
}
// 使用示例
$array = [1, 2, 3, 4, 5];
$value = 5;
if (binarySearchIterative($array, $value)) echo "存在";
if (binarySearchRecursive($array, 0, count($array) - 1, $value)) echo "存在";
```
通过以上方法,您可以在PHP中高效地实现二分搜索。