PHP有序表查找之二分查找「折半查找」算法示例

1. 介绍

折半查找,也称为二分查找,是一种查找算法,用于在有序数组中快速定位指定元素的位置。

2. 算法实现

要使用二分查找算法,需要满足以下两个条件:

数组必须已经按照升序或降序排列。

数组必须是静态的,即不会频繁地插入或删除元素。

折半查找的基本思想是每次将待查找区间的中间元素与目标元素进行比较,从而将待查找区间缩小一半,直到找到目标元素或待查找区间为空。

2.1 算法步骤

下面是折半查找算法的具体步骤:

将待查找区间的左边界设为0,右边界设为n-1,其中n为数组的长度。

如果左边界大于右边界,则代表待查找区间为空,返回查找失败。

计算待查找区间的中间位置mid = (left + right) / 2。

将中间元素arr[mid]与目标元素target进行比较:

如果arr[mid]等于target,则找到目标元素,返回mid。

如果arr[mid]大于target,则目标元素在左半部分,更新右边界为mid-1,继续进行下一轮查找。

如果arr[mid]小于target,则目标元素在右半部分,更新左边界为mid+1,继续进行下一轮查找。

重复步骤2到4,直到找到目标元素或待查找区间为空。

2.2 示例代码

function binarySearch($arr, $target) {

$left = 0;

$right = count($arr) - 1;

while ($left <= $right) {

$mid = intval(($left + $right) / 2);

if ($arr[$mid] == $target) {

return $mid;

}

if ($arr[$mid] < $target) {

$left = $mid + 1;

} else {

$right = $mid - 1;

}

}

return -1; // 查找失败

}

$arr = [1, 3, 5, 7, 9, 11, 13, 15];

$target = 9;

$result = binarySearch($arr, $target);

if ($result == -1) {

echo "找不到目标元素";

} else {

echo "目标元素的索引为: " . $result;

}

3. 算法分析

折半查找算法的时间复杂度为O(logn)。每一次查找都将待查找区间缩小一半,所以需要的比较次数为log2(n)。

折半查找算法是一种高效的查找算法,尤其适用于对大规模有序数组进行查找。但由于折半查找算法要求数组为有序,所以在对静态数组进行频繁插入和删除操作时,并不适合使用折半查找算法。

4. 总结

折半查找是一种高效的查找算法,适用于对有序数组进行查找。通过将待查找区间缩小一半的方式,可以快速定位目标元素的位置。在静态数组中查找目标元素时,折半查找是一种常用的算法。

在实际开发中,我们经常需要在数组中查找指定元素的位置,折半查找是一种非常有用的工具。掌握折半查找算法的原理和实现方式,能够提高数组查找的效率。

后端开发标签