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 相关文章推荐
header()函数使用说明
Nov 23 PHP
Zend 输出产生XML解析错误
Mar 03 PHP
MayFish PHP的MVC架构的开发框架
Aug 13 PHP
Array of country list in PHP with Zend Framework
Oct 17 PHP
PHP去掉从word直接粘贴过来的没有用格式的函数
Oct 29 PHP
php删除字符串末尾子字符,删除开始字符,删除两端字符(实现代码)
Jun 27 PHP
分享一个超好用的php header下载函数
Jan 31 PHP
php+html5实现无刷新图片上传教程
Jan 22 PHP
常用PHP数组排序函数归纳
Aug 08 PHP
微信 开发生成带参数的二维码的实例
Nov 23 PHP
php事务回滚简单实现方法示例
Mar 28 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 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
10个可以简化php开发过程的MySQL工具
2010/04/11 PHP
有关phpmailer的详细介绍及使用方法
2013/01/28 PHP
基于php的微信公众平台开发入门实例
2015/04/15 PHP
php 参数过滤、数据过滤详解
2015/10/26 PHP
php并发加锁示例
2016/10/17 PHP
PHP mkdir创建文件夹实现方法解析
2020/11/13 PHP
如何让div span等元素能响应键盘事件操作指南
2012/11/13 Javascript
JQuery的ready函数与JS的onload的区别详解
2013/11/21 Javascript
页面图片浮动左右滑动效果的简单实现案例
2014/02/10 Javascript
脚本合并提升javascript性能示例
2014/02/24 Javascript
jQuery实现可用于博客的动态滑动菜单
2015/03/09 Javascript
javascript判断变量是否有值的方法
2015/04/20 Javascript
jquery插件jquery.dragscale.js实现拖拽改变元素大小的方法(附demo源码下载)
2016/02/25 Javascript
Angular4 中常用的指令入门总结
2017/06/12 Javascript
全面了解JavaScript的作用域链
2019/04/03 Javascript
layer关闭当前窗口页面以及确认取消按钮的方法
2019/09/09 Javascript
CountUp.js实现数字滚动增值效果
2019/10/17 Javascript
antd日期选择器禁止选择当天之前的时间操作
2020/10/29 Javascript
微信小程序实现底部弹出框
2020/11/18 Javascript
原生js实现放大镜组件
2021/01/22 Javascript
Python实现堆排序的方法详解
2016/05/03 Python
Python对象属性自动更新操作示例
2018/06/15 Python
Python3内置模块pprint让打印比print更美观详解
2019/06/02 Python
如何使用Python发送HTML格式的邮件
2020/02/11 Python
让IE6、IE7、IE8支持CSS3的脚本
2010/07/20 HTML / CSS
html5组织内容_动力节点Java学院整理
2017/07/10 HTML / CSS
GE设备配件:GE Appliance Parts(家电零件、配件和滤水器)
2018/11/28 全球购物
说一下Linux下有关用户和组管理的命令
2016/01/04 面试题
开展党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
检讨书1000字
2014/10/11 职场文书
精神文明建设先进个人事迹材料
2014/12/24 职场文书
企业办公室主任岗位职责
2015/04/01 职场文书
烈士陵园观后感
2015/06/08 职场文书
Python实现制作销售数据可视化看板详解
2021/11/27 Python
pytorch中的 .view()函数的用法介绍
2022/03/17 Python
python 使用tkinter与messagebox写界面和弹窗
2022/03/20 Python