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 相关文章推荐
adodb与adodb_lite之比较
Dec 31 PHP
PHP 中检查或过滤IP地址的实现代码
Nov 27 PHP
php多文件上传功能实现原理及代码
Apr 18 PHP
PHP程序员必须清楚的问题汇总
Dec 18 PHP
CodeIgniter控制器之业务逻辑实例分析
Jan 20 PHP
对比分析php中Cookie与Session的异同
Feb 19 PHP
PHP计算数组中值的和与乘积的方法(array_sum与array_product函数)
Apr 01 PHP
MAC下通过改apache配置文件切换php多版本的方法
Apr 26 PHP
phpMyAdmin无法登陆的解决方法
Apr 27 PHP
PHP date()格式MySQL中插入datetime方法
Jan 29 PHP
laravel5表单唯一验证的实例代码
Sep 30 PHP
详解php中流行的rpc框架
May 29 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格式化日期和时间格式化示例分享
2014/02/24 PHP
destoon实现调用热门关键字的方法
2014/07/15 PHP
PHP对象相互引用的内存溢出实例分析
2014/08/28 PHP
yii2中结合gridview如何使用modal弹窗实例代码详解
2016/06/12 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
2019/06/03 PHP
用javascript做拖动布局的思路
2008/05/31 Javascript
javascript+css 网页每次加载不同样式的实现方法
2009/12/27 Javascript
使用Browserify配合jQuery进行编程的超级指南
2015/07/28 Javascript
javascript封装简单实现方法
2015/08/11 Javascript
javascript数据结构之双链表插入排序实例详解
2015/11/25 Javascript
JavaScript实现的鼠标响应颜色渐变效果完整实例
2017/02/18 Javascript
jQuery插件zTree实现获取一级节点数据的方法
2017/03/08 Javascript
bootstrap table实现点击翻页功能 可记录上下页选中的行
2017/09/28 Javascript
简单的Vue异步组件实例Demo
2017/12/27 Javascript
nodejs基于WS模块实现WebSocket聊天功能的方法
2018/01/12 NodeJs
微信小程序三级联动选择器使用方法
2020/05/19 Javascript
vue-auto-focus: 控制自动聚焦行为的 vue 指令方法
2018/08/25 Javascript
原生JS实现获取及修改CSS样式的方法
2018/09/04 Javascript
webpack打包nodejs项目的方法
2018/09/26 NodeJs
详解vue文件中使用echarts.js的两种方式
2018/10/18 Javascript
Node.js 实现简单的无侵入式缓存框架的方法
2019/07/21 Javascript
mock.js模拟前后台交互
2019/07/25 Javascript
基于axios 的responseType类型的设置方法
2019/10/29 Javascript
[47:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python+MongoDB自增键值的简单实现
2016/11/04 Python
OpenCV实现人脸识别
2017/04/07 Python
TensorFlow实现MLP多层感知机模型
2018/03/09 Python
python调用API实现智能回复机器人
2018/04/10 Python
python使用matplotlib画饼状图
2018/09/25 Python
详解Django-channels 实现WebSocket实例
2019/08/22 Python
盛大二次面试题
2016/11/18 面试题
高一物理教学反思
2014/01/24 职场文书
学校运动会广播稿范文
2014/10/02 职场文书
先进个人事迹材料范文
2014/12/30 职场文书
Java基础之线程锁相关知识总结
2021/06/30 Java/Android
Nginx使用Lua模块实现WAF的原理解析
2021/09/04 Servers