PHP查找一列有序数组是否包含某值的方法

吾爱主题 阅读:150 2021-09-29 13:26:00 评论:0

问题:对于一列有序数组,如何判断给出的一个值,该值是否存在于数组。

思路:判断是否存在,最简单是,直接循环该数组,对每一个值进行比较。但是对于有序数组来说,这样写就完全没有利用好“有序”这一特点。

所有我们使用到“二分法查找”,

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 //有序数组为   $arr = array (2,5,66,87,954,1452,5865);   //查找值   $str = 1452;   //我们先定义 三个参数   $front = 0; //一个开始值下标   $end = count ( $arr ) - 1; //一个结束值下标   $mid = intval (( $front + $end ) / 2); //中间值下标

1、第一次比较,我们直接判断查找值str是否等于中间值mid,如果等于 直接返回 true;

2、如果查找值str大于中间值mid,则说明查找值str可能在中间值的右边,即对开始值front需重新赋值 = 中间值mid + 1,结束值end不用变,依次中间值mid为新的开始值 + 结束值;

3、如果查找值str小于中间值mid,则说明查找值str可能在中间值的左边,即开始值不用变,结束值end需重新赋值 = 中间值 - 1,依次中间值mid为开始值 + 新的结束值;

-----如上,对于传入的开始值,结束值,中间值,进行比较。一旦开始值 大于 结束值 则说明没有找到,结束查询,反之等于就返回已找到。

具体代码如下:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 $str = 89; //查找值   $arr = [1,55,66,89,420]; //有序数组   $ren = find( $arr , $str );   echo '<pre>' ;   var_dump( $ren );   function find( $arr , $str ){     $front = 0; //开始下标     $end = count ( $arr ) - 1; //结束下标     while ( $front <= $end ){ //结束值 大于 开始值 ,反之则退出      $mid = intval (( $front + $end ) / 2); //中间值下标      if ( $str == $arr [ $mid ]){       return $mid ; //存在直接返回值的下标      }      if ( $str > $arr [ $mid ]){       $front = $mid + 1; //在前面      }      if ( $str < $arr [ $mid ]){       $end = $mid - 1; //在后面      }     }     return false;   }

返回结果:89为第四个元素值下标3

int(3)

以上就是PHP查找一列有序数组是否包含某值(二分查找)的详细内容,如果有任何补充可以联系服务器之家小编。

原文链接:https://www.php.cn/php-weizijiaocheng-442205.html

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容