当前位置: 首页 > 后端技术 > PHP

PHP算法-二分搜索

时间:2023-03-29 18:50:44 PHP

BinarySearchBinarySearch,又称BinarySearch,是一种效率更高的搜索方法。但是二分查找要求线性表必须采用顺序存储结构,表中的元素按照key顺序排列。算法要求1.必须使用顺序存储结构。2、一定要按照关键词的大小依次排列。算法步骤其实二分查找还是比较容易理解的。大致分成两份,然后两边比较,保留有效区间,继续分成两份查找,直到找到或者超过区间,所以二分查找的基本步骤是:1.确定区间到被搜索2.确定二分的参考点3.选择区间中的平分点4.根据二分点的值,综合左右区间的情况和求解的目的,丢弃一半没用的interval5.Continue在有效区间内重复上述步骤。代码示例这里主要用到了非递归和递归搜索两种实现方式。代码如下:1.Non-recursivesearch/**binarysearch(也叫binarysearch)--非递归*array$arrtobeSearchinterval*int$numberSearchnumber*int返回找到的key*/publicfunctionbinarySearch($arr,$number){//要搜索的区间不是数组或者为空,则返回-1if(!is_array($arr)||empty($arr)){return-1;}排序($arr);//二分查找关键点$len=count($arr);$低=0;$高=$len-1;//低点小于高点,则退出while($lower<=$high){//以中间点为参考点进行比较$middle=intval(($lower+$high)/2);if($arr[$middle]>$number){//查找的数小于参考值,舍弃右边的$high=$middle-1;}elseif($arr[$middle]<$number){//查找的数大于参考值,舍弃左边$lower=$middle+1;}else{//搜索数等于参考点,则returnreturn$middle;}}返回-1;}2。Recursivesearch/**Binarysearch(也叫二分查找)--recursive*array$arr待搜索范围*int$number搜索数*int$lowerlowpoint*int$highhighpoint*/publicfunctionbinarySearchRecursion($arr,$number,$lower,$high){//如果要查找的范围不是数组或者为空,则返回-1if(!is_array($arr)||empty($arr)){return-1;}排序($arr);$len=count($arr);$middle=intval(($lower+$high)/2);if($arr[$middle]>$number){//搜索数小于参考值,舍弃右边返回$this->binarySearchRecursion($arr,$number,0,$middle-1);}elseif($arr[$middle]<$number){//搜索数大于参考值,舍弃左边返回$this->binarySearchRecursion($arr,$number,$middle+1,$high);}else{//查找数等于参考值,则返回return$middle;}//如果没有找到,则返回-1return-1;}该算法的要求是在$arr范围内找到$number的位置,调用算法如下://Arrayoftherangeoftherange$arr=array(1,2,3,4,5,6,7,10,12,14,18,16,20);//非递归查找25在$arr$binaryK中的位置ey=$this->binarySearch($arr,25);//递归查找12在$arr中的位置$binarySearchRecursionKey=$this->binarySearchRecursion($arr,1,12,count($arr)-1);/打印输出print_r($binaryKey);回声'//';print_r($binarySearchRecursionKey);输出结果-1//8时间复杂度分析如果使用暴力算法在有序数组中查找,即逐一遍历比较,那么时间复杂度为O(n);但是使用二分查找后,由于每次可以舍弃一半的查找区间,所以时间复杂度会降低到O(logn),算法更好(关于算法度的时间复杂度和空间复杂度详解))相关资料PHP算法二分查找