PHP有序表查找之二分查找(折半查找)算法示例


Posted in PHP onFebruary 09, 2018

本文实例讲述了PHP有序表查找之二分查找(折半查找)算法。分享给大家供大家参考,具体如下:

简介:

二分查找技术,又称为折半查找。它的前提是线性表中的记录必须是关键码有序(通常从小到达有序),线性表必须采用顺序存储。

基本思想:

在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所有查找区域无记录,查找失败为止。

代码:

<?php
//二分搜索(折半查找)算法(前提是数组必须是有序数组) 时间复杂度是 O(logn)
$i = 0; //存储对比的次数
//@param 待查找数组
//@param 待搜索的数字
function binsearch($arr,$num){
 $count = count($arr);
 $lower = 0;
 $high = $count - 1;
 global $i;
 while($lower <= $high){
  $i ++; //计数器
  if($arr[$lower] == $num){
   return $lower;
  }
  if($arr[$high] == $num){
   return $high;
  }
  $middle = intval(($lower + $high) / 2);
  if($num < $arr[$middle]){
   $high = $middle - 1;
  }else if($num > $arr[$middle]){
   $lower = $middle + 1;
  }else{
   return $middle;
  }
 }
 //返回-1表示查找失败
 return -1;
}
$arr = array(0,1,16,24,35,47,59,62,73,88,99);
$pos = binsearch($arr,62);
print($pos);
echo "<br>";
echo $i;

运行结果:

7
3

总结:

二叉查找的时间复杂度是 O(logn)。不过由于二叉查找的前提条件是需要有序表顺序存储(数组),如果该有序表需要频繁的执行插入或删除操作,维护有序的排序会带来不小的工作量。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
解析PHP中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用
Jun 21 PHP
PHP中数组定义的几种方法
Sep 01 PHP
PHP Curl出现403错误的解决办法
May 29 PHP
php发送get、post请求的6种方法简明总结
Jul 08 PHP
php的GD库imagettftext函数解决中文乱码问题
Jan 24 PHP
php制作动态随机验证码
Feb 12 PHP
php使用pdo连接sqlite3的配置示例
May 27 PHP
浅谈PHP发送HTTP请求的几种方式
Jul 25 PHP
Laravel中encrypt和decrypt的实现方法
Sep 24 PHP
PHP+Session防止表单重复提交的解决方法
Apr 09 PHP
PHP实现唤起微信支付功能
Feb 18 PHP
Laravel框架下的Contracts契约详解
Mar 17 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
Feb 08 #PHP
PHP基于redis计数器类定义与用法示例
Feb 08 #PHP
php处理抢购类功能的高并发请求
Feb 08 #PHP
php+redis实现商城秒杀功能
Nov 19 #PHP
php+redis消息队列实现抢购功能
Feb 08 #PHP
PHP多线程模拟实现秒杀抢单
Feb 07 #PHP
PHP设计模式之装饰器模式实例详解
Feb 07 #PHP
You might like
PHP注释实例技巧
2008/10/03 PHP
字母顺序颠倒而单词顺序不变的php代码
2010/08/08 PHP
PHP实现自动对图片进行滚动显示的方法
2015/03/12 PHP
php实现图片等比例缩放代码
2015/07/23 PHP
DD_belatedPNG,IE6下PNG透明解决方案(国外)
2010/12/06 Javascript
小试JQuery的AutoComplete插件
2011/05/04 Javascript
js获取判断上传文件后缀名的示例代码
2014/02/19 Javascript
js日期范围初始化得到前一个月日期的方法
2015/05/05 Javascript
jQuery实现的分子运动小球碰撞效果
2016/01/27 Javascript
jQuery链式调用与show知识浅析
2016/05/11 Javascript
a标签置灰不可点击的实现方法
2017/02/06 Javascript
Zepto实现密码的隐藏/显示
2017/04/07 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
vue动态设置img的src路径实例
2018/09/18 Javascript
JS中实现一个下载进度条及播放进度条的代码
2019/06/10 Javascript
微信小程序开发之转发分享功能
2019/10/22 Javascript
VUE 组件转换为微信小程序组件的方法
2019/11/06 Javascript
详细介绍Python语言中的按位运算符
2013/11/26 Python
python中kmeans聚类实现代码
2018/02/23 Python
解决python3 json数据包含中文的读写问题
2018/05/10 Python
我就是这样学习Python中的列表
2019/06/02 Python
python实现tail -f 功能
2020/01/17 Python
Pandas时间序列:时期(period)及其算术运算详解
2020/02/25 Python
pycharm 激活码及使用方式的详细教程
2020/05/12 Python
pytorch查看通道数 维数 尺寸大小方式
2020/05/26 Python
Python内置函数property()如何使用
2020/09/01 Python
Python jieba结巴分词原理及用法解析
2020/11/05 Python
css3 仿写阿里云水纹效果的示例代码
2018/02/10 HTML / CSS
Dyson加拿大官方网站:购买戴森吸尘器,风扇,冷热器及配件
2016/10/26 全球购物
优秀研究生自我鉴定
2013/12/04 职场文书
招聘专员岗位职责
2014/03/07 职场文书
酒店仓管员岗位职责
2014/04/28 职场文书
规范化管理年活动总结
2014/08/29 职场文书
五年级语文教学反思
2016/03/03 职场文书
不会写演讲稿,快来看看这篇文章!
2019/08/06 职场文书
Nginx设置HTTPS的方法步骤 443证书配置方法
2022/03/21 Servers