PHP 程序在数组中实现二分查找算法


2022年5月11日, Learn eTutorial
2074

在编写程序之前,我们先了解一下二分查找算法

什么是二分查找算法?

搜索算法用于在元素列表中查找元素的出现。它检查列表中是否有匹配项,如果找到匹配项则返回索引值,否则返回消息“列表中未找到该元素”。

二分查找算法也称为“半区间算法”或“对数算法”。它作用于有序列表,这意味着它在排序数组中搜索元素。如果给定数组未排序,则需要先对元素进行排序,然后在其上实现搜索。该算法采用分治法。它首先通过获取列表的中间元素将列表分成两部分,并检查搜索元素是否与中间元素匹配。如果两者相等则返回索引,否则算法选择其中一个子列表,其中搜索元素存在的可能性更大。这种子列表的划分和搜索将持续到子列表的大小减小到零。

它在大列表上比在小列表上工作得更快。二叉搜索树和 B 树数据结构都基于二分查找。二分查找的最坏情况时间复杂度为 O(logn)。

如何在 PHP 中实现二分查找?

  • 可以编写一个 `function` 来在 PHP 中实现二分查找。已排序的数组和搜索项可以作为输入变量传递给函数。并且,
  • 使用 `while loop` 首先计算中间元素,然后将中间元素与搜索项进行检查,如果匹配则 `return` true,
  • 现在通过比较它们的值来重新绑定列表以进行检查,如果搜索元素 < 中间元素,则将右边界重置为中间元素之前的索引,否则将左边界重置为中间元素之后的索引。
  • 重复上述过程,直到子数组的大小减小到零。
  • 如果元素不存在,则在 `function` 中将 `return` false 作为最后一条语句
  • 在主部分调用 `function`,传入已排序的数组、搜索值,并根据 `function` 的 `return` 值 `echo` 结果

现在,让我们看看二分查找算法的工作原理。取一个数组 (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 源代码

                                          <?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