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

PHP算法二分搜索

时间:2023-03-30 03:52:55 PHP

二分搜索的定义BinarySearch也称为二分搜索(BinarySearch),是一种效率更高的搜索方法。但是二分查找要求线性表必须采用顺序存储结构,表中的元素按照key顺序排列。算法的要求从上面的定义我们可以知道,要满足算法的要求,必须采用以下两点:必须采用顺序存储结构。必须按关键字大小排序。算法的步骤其实二分查找还是比较容易理解的。大致分成两份,然后比较两边,保留有效区间,继续分成两份查找,直到找到或超过区间,所以二分查找的基本步骤是:确定要查找的区间和分割时确定参考点。选择区间中的二分点。根据二分点的值,结合左右区间的情况和求解的目的,舍弃一半无用区间,在有效区间继续重复上述步骤。算法源码这里我主要用递归和非递归的方法来实现,如下:首先,第一个是非递归算法实现,算法如下:/***二分查找算法*@paramarray$arr查找的间隔*@paramint$number查找数*@returnint返回找到的key*/functionbinary_search($arr,$number){//如果不是数组或者数组为空,返回-1直接if(!is_array($arr)||empty($arr)){return-1;}//初始变量值$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{//如果搜索数等于参考点,返回$middle;}}//如果没有找到,返回-1return-1;}那么第二种是递归算法实现,算法如下:/***@paramarray$arr要搜索的区间*@paramint$number搜索编号*@paramint$lower区间的最低点*@paramint$high区间的最高点*@returnint*/functionbinary_search_recursion(&$arr,$number,$lower,$high){//使用区间的中间点作为比较的参考点$middle=intval(($lower+$high)/2);//如果最低点大于最高点则退出($lower>$high){return-1;}if($number>$arr[$middle]){//查找数大于参考点,舍弃左边继续查找returnbinary_search_recursion($arr,$number,$middle+1,$high);}elseif($number<$arr[$middle]){//查找数小于参考点,舍弃右边继续查找returnbinary_search_recursion($arr,$number,$lower,$middle-1);}else{return$middle;}}该算法的要求是找到一个数($number)在数组区间($arr)中的位置,因此,调用算法进行搜索,如下://Rangetosearched$arr=[1,3,7,9,11,57,63,99];//非递归查找57的位置$find_key=binary_search($arr,57);//递归查找57的位置$find_key_r=binary_search_recursion($arr,57,0,count($arr));//输出打印print_r($find_key);print_r($find_key_r);一个有序数组的时间复杂度分析如果使用暴力算法查找,即逐一遍历比较,则时间复杂度为O(n);但是使用二分查找后,因为每次可以舍弃一半的查找区间,所以时间复杂度会降低到O(logn),算法更好,最后无聊客气话的时间是老规矩.如有任何疑问,请直接留言。有想法请直接说。如有错误请直接提出。我会及时回复,谢谢。