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 相关文章推荐
ThinkPHP查询中的魔术方法简述
Jun 25 PHP
PHP如何通过AJAX方式实现登录功能
Nov 23 PHP
PHP的数组中提高元素查找与元素去重的效率的技巧解析
Mar 03 PHP
Thinkphp框架开发移动端接口(2)
Aug 18 PHP
PHP 验证身份证是否合法的函数
Feb 09 PHP
php生成条形码的图片的实例详解
Sep 13 PHP
php实现微信支付之退款功能
May 30 PHP
strpos() 函数判断字符串中是否包含某字符串的方法
Jan 16 PHP
php原生数据库分页的代码实例
Feb 18 PHP
windows 2008r2+php5.6.28环境搭建详细过程
Jun 18 PHP
laravel 框架结合关联查询 when()用法分析
Nov 22 PHP
简单的php购物车代码
Jun 05 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防止跨域提交表单
2013/11/01 PHP
js+php实现静态页面实时调用用户登陆状态的方法
2015/01/04 PHP
PHP通过引用传递参数用法分析
2016/12/01 PHP
PHP7下协程的实现方法详解
2017/12/17 PHP
Laravel第三方包报class not found的解决方法
2019/10/13 PHP
javascript的trim,ltrim,rtrim自定义函数
2008/09/21 Javascript
Jquery图形报表插件 jqplot简介及参数详解
2012/10/10 Javascript
AngularJS入门教程(一):静态模板
2014/12/06 Javascript
jQuery头像裁剪工具jcrop用法实例(附演示与demo源码下载)
2016/01/22 Javascript
jQuery+ajax实现动态添加表格tr td功能示例
2018/04/23 jQuery
Webpack4 使用Babel处理ES6语法的方法示例
2019/03/07 Javascript
Vue.extend 编程式插入组件的实现
2019/11/18 Javascript
使用JS location实现搜索框历史记录功能
2019/12/23 Javascript
解决vue scoped html样式无效的问题
2020/10/24 Javascript
Python中处理字符串之isalpha()方法的使用
2015/05/18 Python
理解python正则表达式
2016/01/15 Python
Python中random模块生成随机数详解
2016/03/10 Python
python3编码问题汇总
2016/09/06 Python
python中模块查找的原理与方法详解
2017/08/11 Python
Centos部署django服务nginx+uwsgi的方法
2019/01/02 Python
Pandas统计重复的列里面的值方法
2019/01/30 Python
python装饰器相当于函数的调用方式
2019/12/27 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
windows10环境下用anaconda和VScode配置的图文教程
2020/03/30 Python
香蕉共和国工厂店:Banana Republic Factory
2018/06/09 全球购物
俄罗斯在线水暖商店:Perfecto.ru
2019/10/25 全球购物
SQL Server的固定数据库角色都有哪些?对应的服务器权限有哪些?
2013/05/18 面试题
linux面试题参考答案(1)
2016/01/22 面试题
就业意向书范文
2014/04/01 职场文书
党的群众路线教育实践活动查摆问题及整改措施
2014/10/10 职场文书
党的群众路线教育实践活动总结大会主持词
2014/10/30 职场文书
离婚撤诉申请书范本
2015/05/18 职场文书
教你使用pyinstaller打包Python教程
2021/05/27 Python
Python中requests做接口测试的方法
2021/05/30 Python
OpenCV实现常见的四种图像几何变换
2022/04/01 Python
Win11应用商店打开闪退怎么解决? win11应用商店打不开的多种解决办法
2022/04/05 数码科技