在PHP中进行二分查找
二分查找,也称折半查找,是一种效率较高的查找算法,前提是数据必须是有序的。在数组中查找一个元素时,从数组的中间元素开始,如果中间元素正好是要查找的元素,则查找过程结束;如果某一时刻要查找的元素小于或者大于中间元素,则在数组大于或小于中间元素的那一半中查找,然后重复上述过程,直到找到相应的元素为止。
1. 二分查找算法的PHP实现
实现二分查找算法的PHP函数如下所示:
/**
* 二分查找算法实现
* @param array $arr 待查找数组
* @param int $target 目标元素
* @return int 查找结果下标
*/
function binarySearch(array $arr, int $target): int
{
$left = 0;
$right = count($arr) - 1;
while ($left <= $right) {
$mid = $left + intval(($right - $left) / 2);
if ($arr[$mid] == $target) {
return $mid;
} elseif ($arr[$mid] < $target) {
$left = $mid + 1;
} else {
$right = $mid - 1;
}
}
return -1;
}
其中,函数的参数包含需要查找的有序数组和目标元素。函数通过分别设置左右下标找到数组的中间位置,并根据目标元素和中间元素的大小关系继续缩小查找范围,直到找到目标元素或遍历完整个数组。
2. 二分查找算法的时间复杂度分析
一般情况下,时间复杂度用大O表示法来表示。在二分查找算法中,时间复杂度为O(logn)。其中n代表数组中元素的数量。
从时间复杂度的角度来分析,当数据规模n相对较小的时候,二分查找算法的效率并不高。但是当数据规模变得非常大时,二分查找算法比顺序查找算法的效率更高。
3. 二分查找算法的应用场景
2分查找算法的应用场景非常广泛,可以用于在有序数组、有序链表等数据结构中搜索指定元素,也可以用于在数值范围内搜索满足条件的元素,例如:
3.1 在有序数组中搜索指定元素
假设有一个有序数组:
$arr = array(1, 3, 5, 7, 9, 11, 13);
现在需要查找元素7在数组中的下标,可以调用上述定义的二分查找算法函数查找:
$index = binarySearch($arr, 7);
if ($index != -1) {
echo "元素7的下标为:$index";
} else {
echo "元素7不存在";
}
运行结果如下所示:
元素7的下标为:3
3.2 在数值范围内搜索满足条件的元素
假设需要在1至1000之间的整数中查找所有能够整除7的数:
$start = 1;
$end = 1000;
$target = 7;
$index = -1;
while ($start <= $end) {
$mid = $start + intval(($end - $start) / 2);
if ($mid % $target == 0) {
$index = $mid;
break;
} elseif ($mid < $target) {
$start = $mid + 1;
} else {
$end = $mid - 1;
}
}
if ($index != -1) {
echo "满足条件的第一个数是:$index";
} else {
echo "不存在满足条件的数";
}
运行结果如下所示:
满足条件的第一个数是:7
4. 总结
二分查找算法是一种高效的查找算法,在有序数组、有序链表等数据结构中有广泛的应用。虽然时间复杂度为O(logn),但当数据规模变得非常大时,比顺序查找算法的效率更高。对于需要反复查找的情况,建议使用二分查找算法进行优化。