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 相关文章推荐
Win9x/ME下Apache+PHP安装配置
Oct 09 PHP
PHP文件下载类
Dec 06 PHP
解析crontab php自动运行的方法
Jun 24 PHP
Smarty局部缓存的几种方法简介
Jun 17 PHP
PHP中常用的字符串格式化函数总结
Nov 19 PHP
php删除文本文件中重复行的方法
Apr 28 PHP
学习php设计模式 php实现合成模式(composite)
Dec 08 PHP
PHP读取XML格式文件的方法总结
Feb 27 PHP
自写的利用PDO对mysql数据库增删改查操作类
Feb 19 PHP
PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
Apr 20 PHP
PHP序列化的四种实现方法与横向对比
Nov 29 PHP
Laravel5.1 框架表单验证操作实例详解
Jan 07 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
paypal即时到账php实现代码
2010/11/28 PHP
ThinkPHP采用模块和操作分析
2011/04/18 PHP
PHPStorm+XDebug进行调试图文教程
2016/06/13 PHP
PHP实现四种基础排序算法的运行时间比较(推荐)
2016/08/11 PHP
PHP使用Nginx实现反向代理
2017/09/20 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
JavaScript去掉空格的方法集合
2010/12/28 Javascript
Node.js插件的正确编写方式
2014/08/03 Javascript
jQuery Validate表单验证入门学习
2015/12/18 Javascript
修改ligerui 默认确认按钮的方法
2016/12/27 Javascript
利用iscroll4实现轮播图效果实例代码
2017/01/11 Javascript
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
详解Vue后台管理系统开发日常总结(组件PageHeader)
2019/11/01 Javascript
关于vue里页面的缓存详解
2019/11/04 Javascript
vue实现路由懒加载的3种方法示例
2020/09/01 Javascript
vue中后端做Excel导出功能返回数据流前端的处理操作
2020/09/08 Javascript
vue点击Dashboard不同内容 跳转到同一表格的实例
2020/11/13 Javascript
8个非常实用的Vue自定义指令
2020/12/15 Vue.js
Python实现爬虫抓取与读写、追加到excel文件操作示例
2018/06/27 Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
2018/11/29 Python
Python实现多线程下载脚本的示例代码
2020/04/03 Python
Python3+selenium配置常见报错解决方案
2020/08/28 Python
Python 打印自己设计的字体的实例讲解
2021/01/04 Python
Russell Stover巧克力官方网站:美国领先的精美巧克力制造商
2016/11/27 全球购物
荷兰的时尚市场:To Be Dressed
2019/05/06 全球购物
AutoShack.com加拿大:北美主要的汽车零部件零售商
2019/07/24 全球购物
应届生幼儿园求职信
2013/11/12 职场文书
业务主管岗位职责范本
2013/12/25 职场文书
租房协议书范本
2014/04/09 职场文书
创建青年文明号材料
2014/05/09 职场文书
领导班子四风对照检查材料范文
2014/09/27 职场文书
2014年仓管员工作总结
2014/11/18 职场文书
论语读书笔记
2015/06/26 职场文书
Python利器openpyxl之操作excel表格
2021/04/17 Python
《进击的巨人》新联动CM 兵长强势出击兽巨人
2022/04/05 日漫