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


Posted in PHP onFebruary 07, 2020

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

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

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

//有序数组为

$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查找一列有序数组是否包含某值(二分查找)的详细内容,如果有任何补充可以联系三水点靠木小编。

PHP 相关文章推荐
PHP Ajax实现页面无刷新发表评论
Jan 02 PHP
smarty section简介与用法分析
Oct 03 PHP
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
Feb 16 PHP
适用于抽奖程序、随机广告的PHP概率算法实例
Apr 09 PHP
PHP中数据库单例模式的实现代码分享
Aug 21 PHP
常见php数据文件缓存类汇总
Dec 05 PHP
php发送与接收流文件的方法
Feb 11 PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
Oct 09 PHP
PHP中JSON的应用技巧
Oct 10 PHP
php中使用websocket详解
Sep 23 PHP
php版微信公众平台入门教程之开发者认证的方法
Sep 26 PHP
PHP进阶学习之类的自动加载机制原理分析
Jun 18 PHP
php测试kafka项目示例
Feb 06 #PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
Feb 06 #PHP
PHP实现常用排序算法的方法
Feb 05 #PHP
PHP ElasticSearch做搜索实例讲解
Feb 05 #PHP
PHP实现新型冠状病毒疫情实时图的实例
Feb 04 #PHP
php post换行的方法
Feb 03 #PHP
PHP中mysqli_get_server_version()的实例用法
Feb 03 #PHP
You might like
Yii2隐藏frontend/web和backend/web的方法
2015/12/12 PHP
Laravel统计一段时间间隔的数据方法
2019/10/09 PHP
jQuery使用手册之二 DOM操作
2007/03/24 Javascript
js实现页面跳转重定向的几种方式
2014/05/29 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
2014/05/29 Javascript
javascript实现左右控制无缝滚动
2014/12/31 Javascript
jQuery实现数秒后自动提交form的方法
2015/03/05 Javascript
kindeditor修复会替换script内容的问题
2015/04/03 Javascript
js显示文本框提示文字的方法
2015/05/07 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
2016/06/28 Javascript
js实现拖拽功能
2017/03/01 Javascript
Vuejs实现带样式的单文件组件新方法
2017/05/02 Javascript
JS仿QQ好友列表展开、收缩功能(第二篇)
2017/07/07 Javascript
react-native组件中NavigatorIOS和ListView结合使用的方法
2017/09/30 Javascript
Koa2 之文件上传下载的示例代码
2018/03/29 Javascript
在vue-cli的组件模板里使用font-awesome的两种方法
2018/09/28 Javascript
JS如何获取地址栏的参数实例讲解
2018/10/06 Javascript
js canvas实现橡皮擦效果
2018/12/20 Javascript
微信小程序动画组件使用解析,类似vue,且更强大
2019/08/01 Javascript
手把手教您实现react异步加载高阶组件
2020/04/07 Javascript
Python自动化测试工具Splinter简介和使用实例
2014/05/13 Python
python调用短信猫控件实现发短信功能实例
2014/07/04 Python
Python切片用法实例教程
2014/09/08 Python
ubuntu系统下 python链接mysql数据库的方法
2017/01/09 Python
pygame游戏之旅 添加游戏界面按键图形
2018/11/20 Python
Python字符串的全排列算法实例详解
2019/01/07 Python
200行python代码实现2048游戏
2019/07/17 Python
pytorch使用指定GPU训练的实例
2019/08/19 Python
css3实现的多级渐变下拉菜单导航效果代码
2015/08/31 HTML / CSS
New Balance加拿大官方网站:运动鞋和健身服装
2018/11/19 全球购物
高级文秘工作总结的自我评价
2013/09/28 职场文书
护理助产毕业生的求职信
2014/03/02 职场文书
小学生学习感言
2014/03/10 职场文书
学校党支部承诺书
2015/04/30 职场文书
奠基仪式致辞
2015/07/30 职场文书
Python进行区间取值案例讲解
2021/08/02 Python