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+Html+缓存
Nov 25 PHP
windows xp下安装pear
Dec 02 PHP
echo, print, printf 和 sprintf 区别
Dec 06 PHP
PHP 日期时间函数的高级应用技巧
Oct 10 PHP
php多维数组去掉重复值示例分享
Mar 02 PHP
在Linux系统的服务器上隐藏PHP版本号的方法
Jun 06 PHP
PHP设计模式之观察者模式实例
Feb 22 PHP
php 生成签名及验证签名详解
Oct 26 PHP
微信开发之php表单微信中自动提交两次问题解决办法
Jan 08 PHP
PHP模糊查询技术实例分析【附源码下载】
Mar 07 PHP
laravel邮件发送的实现代码示例
Jan 31 PHP
七种PHP开发环境搭建工具
Jun 28 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
星际玩家的三大定律
2020/03/04 星际争霸
牡丹941资料
2021/03/01 无线电
PHP操作MySQL事务实例
2014/11/05 PHP
PHP中开启gzip压缩的2种方法
2015/01/31 PHP
WordPress过滤垃圾评论的几种主要方法小结
2016/07/11 PHP
总结AJAX相关JS代码片段和浏览器模型
2007/08/15 Javascript
JavaScript OOP类与继承
2009/11/15 Javascript
JS中数组Array的用法示例介绍
2014/02/20 Javascript
javaScript中Math()函数注意事项
2015/06/18 Javascript
jQuery 3.0十大新特性
2016/07/06 Javascript
ionic cordova一次上传多张图片(类似input file提交表单)的实现方法
2016/12/16 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
2017/01/21 Javascript
jQuery元素选择器实例代码
2017/02/06 Javascript
bootstrap table表格使用方法详解
2017/04/26 Javascript
nodejs+websocket实时聊天系统改进版
2017/05/18 NodeJs
解决vue 绑定对象内点击事件失效问题
2018/09/05 Javascript
微信小程序传值以及获取值方法的详解
2019/04/29 Javascript
vue中$refs, $emit, $on, $once, $off的使用详解
2019/05/26 Javascript
Python实现二叉堆
2016/02/03 Python
python2与python3爬虫中get与post对比解析
2019/09/18 Python
python正则过滤字母、中文、数字及特殊字符方法详解
2020/02/11 Python
python读写文件write和flush的实现方式
2020/02/21 Python
python实现引用其他路径包里面的模块
2020/03/09 Python
html5中如何将图片的绝对路径转换成文件对象
2018/01/11 HTML / CSS
美国购买和销售礼品卡平台:Raise
2017/01/13 全球购物
锐步英国官网:Reebok英国
2019/11/29 全球购物
结婚典礼证婚词
2014/01/08 职场文书
中学生学雷锋活动心得体会
2014/03/10 职场文书
2014院党委领导班子及其成员群众路线对照检查材料思想汇报
2014/10/04 职场文书
出纳年终工作总结2014
2014/12/05 职场文书
2019年英语版感谢信(8篇)
2019/09/29 职场文书
python内置进制转换函数的操作
2021/06/02 Python
Python爬虫入门案例之爬取二手房源数据
2021/10/16 Python
使用CSS设置滚动条样式
2022/01/18 HTML / CSS
基于Python实现对比Exce的工具
2022/04/07 Python
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
2022/04/24 Vue.js