在编写程序之前,我们先了解一下二分查找算法
搜索算法用于在元素列表中查找元素的出现。它检查列表中是否有匹配项,如果找到匹配项则返回索引值,否则返回消息“列表中未找到该元素”。
二分查找算法也称为“半区间算法”或“对数算法”。它作用于有序列表,这意味着它在排序数组中搜索元素。如果给定数组未排序,则需要先对元素进行排序,然后在其上实现搜索。该算法采用分治法。它首先通过获取列表的中间元素将列表分成两部分,并检查搜索元素是否与中间元素匹配。如果两者相等则返回索引,否则算法选择其中一个子列表,其中搜索元素存在的可能性更大。这种子列表的划分和搜索将持续到子列表的大小减小到零。
它在大列表上比在小列表上工作得更快。二叉搜索树和 B 树数据结构都基于二分查找。二分查找的最坏情况时间复杂度为 O(logn)。
现在,让我们看看二分查找算法的工作原理。取一个数组 (6,7,8,9,11,14,18,23),搜索元素 18。我们有 6 在开始,23 在最后,11 在中间,检查中间元素是否为 18。它不是,而且 11 小于 18,所以现在要搜索的列表变成 (14,18,23),即右子数组。在这里我们将与中间元素匹配,因此我们的搜索成功了。
步骤 1:编写一个函数 `binarySearch`,带变量数组 arr 和搜索值 item。
步骤 2:初始化变量 low 为 0,high 为最后一个索引
步骤 3:启动一个 `while loop`,重复直到条件 low <= high,
步骤 4:找到数组的中间索引 mid,并检查中间元素与 item 是否匹配,如果匹配则 `return` true
步骤 5:检查如果 item < arr[mid] 则最后一个索引变为 high = mid-1,否则起始索引变为 low = mid+1
步骤 6:现在以 `return` false 结束函数,表示未找到匹配项
步骤 7:用值和要搜索的 item 初始化一个数组 arr
步骤 8:调用 binarySearch(),传入值 arr, item,并检查 `return` 值并 `echo` 适当的结果
<?php
function binarySearch(Array $arr, $item)
{
// check for empty array
if (count($arr) == 0) return false;
$low = 0;
$high = count($arr) - 1;
while ($low <= $high) {
// compute middle index
$mid = floor(($low + $high) / 2);
// element found at mid
if($arr[$mid] == $item) {
return true;
}
if ($item < $arr[$mid]) {
// search the left side of the array
$high = $mid -1;
}
else {
// search the right side of the array
$low = $mid + 1;
}
}
// If we reach here element x doesn't exist
return false;
}
$arr = array(6,7,8,9,11,14,18,23);
$item = 18;
if(binarySearch($arr, $item) == true) {
$index=array_search($item, $arr);
echo " Element is present at index ".$index;
}
else {
echo " Element is not present in the array";
}
?>
Element is present at index 6