学习PHP查寻一列有序数组可否包括某值的办法
问题:关于一列有序数组,怎样推断给出的一个值,该值可否存在于数组。
思绪:推断可否存在,最简便是,直接轮回该数组,对每一个值停止比力。但是关于有序数组来说,这样写就完全没有益用好“有序”这一特点。
相关学习引荐:php编程(视频)
所有我们使用到“二分法查寻”,
//有序数组为 $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为开端值 + 新的完毕值;
-----如上,关于传入的开端值,完毕值,中心值,停止比力。一旦开端值 大于 完毕值 则说明没有寻到,完毕查询,反之等于就返回已寻到。
详细代码如下:
$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查寻一列有序数组可否包括某值的办法的具体内容,更多请关注百分百源码网其它相关文章!