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实现WEB动态网页静态
Oct 09 PHP
php 中include()与require()的对比
Oct 09 PHP
DedeCMS 核心类TypeLink.class.php摘要笔记
Apr 07 PHP
第4章 数据处理-php数组的处理-郑阿奇
Jul 04 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
Nov 23 PHP
PHP spl_autoload_register实现自动加载研究
Dec 06 PHP
解析在apache里面给php写虚拟目录的详细方法
Jun 24 PHP
destoon会员注册提示“数据校验失败(2)”解决方法
Jun 21 PHP
Codeigniter(CI)框架分页函数及相关知识
Nov 03 PHP
PHP中set_include_path()函数相关用法分析
Jul 18 PHP
完美的php分页类
Oct 24 PHP
thinkPHP框架乐观锁和悲观锁实例分析
Oct 30 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
用定制的PHP应用程序来获取Web服务器的状态信息
2006/10/09 PHP
php计算年龄精准到年月日
2015/11/17 PHP
PHPstorm启用自动换行的方法详解(IDE)
2020/09/17 PHP
JavaScript聚焦于第一个字段的代码
2010/10/15 Javascript
Fastest way to build an HTML string(拼装html字符串的最快方法)
2011/08/20 Javascript
firefox下jQuery UI Autocomplete 1.8.*中文输入修正方法
2012/09/19 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
2016/02/16 Javascript
JQuery之proxy实现绑定代理方法
2016/08/01 Javascript
js输入框使用正则表达式校验输入内容的实例
2017/02/12 Javascript
Angularjs中的ui-bootstrap的使用教程
2017/02/19 Javascript
nodejs个人博客开发第三步 载入页面
2017/04/12 NodeJs
原生javascript实现分页效果
2017/04/21 Javascript
JavaScript实现隐藏省略文字效果的方法
2017/04/27 Javascript
Node.js利用断言模块assert进行单元测试的方法
2017/09/28 Javascript
前端必备插件之纯原生JS的瀑布流插件Macy.js
2017/11/22 Javascript
js实现购物车功能
2018/06/12 Javascript
vue实现图片预览组件封装与使用
2019/07/13 Javascript
我所理解的JavaScript中的this指向
2020/09/04 Javascript
[00:27]DOTA2荣耀之路2:Patience from zhou!
2018/05/24 DOTA
[01:09:50]VP vs Pain 2018国际邀请赛小组赛BO2 第二场
2018/08/20 DOTA
Python基于SMTP协议实现发送邮件功能详解
2018/08/14 Python
python opencv实现信用卡的数字识别
2020/01/12 Python
tensorflow-gpu安装的常见问题及解决方案
2020/01/20 Python
Python函数参数分类原理详解
2020/05/28 Python
Python实现在线批量美颜功能过程解析
2020/06/10 Python
采用冷却技术的超自然舒适度:GhostBed床垫
2018/09/18 全球购物
Nike瑞士官网:Nike CH
2021/01/18 全球购物
文明学生事迹材料
2014/01/29 职场文书
文化活动实施方案
2014/03/28 职场文书
慰问敬老院活动总结
2014/04/26 职场文书
煤矿安全演讲稿
2014/05/09 职场文书
升学宴学生致辞
2015/07/27 职场文书
浅谈Python中的函数(def)及参数传递操作
2021/05/25 Python
MySQL中B树索引和B+树索引的区别详解
2022/03/03 MySQL
instantclient客户端 连接oracle数据库
2022/04/26 Oracle