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中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
Mar 29 PHP
php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
May 04 PHP
php截取后台登陆密码的代码
May 05 PHP
分享一个PHP数据流应用的简单例子
Jun 01 PHP
解析PHP SPL标准库的用法(遍历目录,查找固定条件的文件)
Jun 18 PHP
php接口与接口引用的深入解析
Aug 09 PHP
详解PHP错误日志的获取方法
Jul 20 PHP
深入讲解PHP Session及如何保持其不过期的方法
Aug 18 PHP
win平台安装配置Nginx+php+mysql 环境
Jan 12 PHP
PHP缓冲区用法总结
Feb 14 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
Aug 30 PHP
thinkphp5 migrate数据库迁移工具
Feb 20 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
苏联队长,苏联超人蝙蝠侠,这些登场的“山寨”英雄真的很严肃
2020/04/09 欧美动漫
smarty+adodb+部分自定义类的php开发模式
2006/12/31 PHP
Mysql的GROUP_CONCAT()函数使用方法
2008/03/28 PHP
php统计文件大小,以GB、MB、KB、B输出
2011/05/29 PHP
PHP使用mysql_fetch_row查询获得数据行列表的方法
2015/03/18 PHP
php+ajax实现仿百度查询下拉内容功能示例
2017/10/20 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
一个javascript图片阅览组件
2010/11/09 Javascript
原生JS操作网页给p元素添加onclick事件及表格隔行变色
2013/12/01 Javascript
jquery实现标签支持图文排列带上下箭头按钮的选项卡
2015/03/14 Javascript
JavaScript中的anchor()方法使用详解
2015/06/08 Javascript
AngualrJS中的Directive制作一个菜单
2016/01/26 Javascript
用Vue编写抽象组件的方法
2019/05/06 Javascript
tweenjs缓动算法的使用实例分析
2019/08/26 Javascript
JavaScript实时更新当前的时间的示例代码
2020/07/15 Javascript
Python按行读取文件的简单实现方法
2016/06/22 Python
python daemon守护进程实现
2016/08/27 Python
Python在Matplotlib图中显示中文字体的操作方法
2019/07/29 Python
python 使用socket传输图片视频等文件的实现方式
2019/08/07 Python
Python Dict找出value大于某值或key大于某值的所有项方式
2020/06/05 Python
pymongo insert_many 批量插入的实例
2020/12/05 Python
Css3圆角边框制作代码
2015/11/18 HTML / CSS
美国零售商店:Blue&Cream
2017/04/07 全球购物
Java里面如何把一个Array数组转换成Collection, List
2013/07/26 面试题
电子商务专业个人的自我评价
2013/11/19 职场文书
出国留学计划书
2014/04/27 职场文书
一体化教学实施方案
2014/05/10 职场文书
小学生志愿者活动方案
2014/08/23 职场文书
致青春观后感
2015/06/09 职场文书
解决Pytorch半精度浮点型网络训练的问题
2021/05/24 Python
MySQL如何解决幻读问题
2021/08/07 MySQL
一行Python命令实现批量加水印
2022/04/07 Python
vue实现列表拖拽排序的示例代码
2022/04/08 Vue.js
IDEA 2022 Translation 未知错误 翻译文档失败
2022/04/24 Java/Android
react中useState使用:如何实现在当前表格直接更改数据
2022/08/05 Javascript
Spring Boot实现文件上传下载
2022/08/14 Java/Android