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 select,radio和checkbox默认选择的实现方法
May 15 PHP
Discuz Uchome ajaxpost小技巧
Jan 04 PHP
PHP生成sitemap.xml地图函数
Nov 13 PHP
php实现数组筛选奇数和偶数示例
Apr 11 PHP
phpmailer在服务器上不能正常发送邮件的解决办法
Jul 08 PHP
php中限制ip段访问、禁止ip提交表单的代码分享
Aug 22 PHP
ThinkPHP多语言支持与多模板支持概述
Aug 22 PHP
刷新PHP缓冲区为你的站点加速
Oct 10 PHP
Laravel学习教程之本地化模块
Aug 18 PHP
实例讲解PHP验证邮箱是否合格
Jan 28 PHP
PhpSpreadsheet设置单元格常用操作汇总
Nov 13 PHP
如何用PHP实现分布算法之一致性哈希算法
May 26 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和XSS跨站攻击的防范
2007/04/17 PHP
PHP中设置时区,记录日志文件的实现代码
2013/01/07 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
2014/06/12 PHP
php压缩和解压缩字符串的方法
2015/03/14 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
2016/11/04 PHP
Jquery动态改变图片IMG的src地址示例
2013/06/25 Javascript
javascript自启动函数的问题探讨
2013/10/05 Javascript
不使用jquery实现js打字效果示例分享
2014/01/19 Javascript
JS 弹出层 定位至屏幕居中示例
2014/05/21 Javascript
nodejs npm package.json中文文档
2014/09/04 NodeJs
node.js中的fs.chown方法使用说明
2014/12/16 Javascript
moment.js轻松实现获取当前日期是当年的第几周
2015/02/05 Javascript
简介JavaScript中strike()方法的使用
2015/06/08 Javascript
JS实现复制内容到剪贴板功能兼容所有浏览器(推荐)
2016/06/17 Javascript
关于vue v-for 循环问题(一行显示四个,每一行的最右边那个计算属性)
2018/09/04 Javascript
JavaScript实现选项卡效果的分析及步骤
2019/04/16 Javascript
Vue.js@2.6.10更新内置错误处机制Fundebug同步支持相应错误监控
2019/05/13 Javascript
axios实现文件上传并获取进度
2020/03/25 Javascript
如何手动实现一个 JavaScript 模块执行器
2020/10/16 Javascript
[01:03:27]NAVI vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python中os和shutil模块实用方法集锦
2014/05/13 Python
python转换字符串为摩尔斯电码的方法
2015/07/06 Python
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
2016/04/12 Python
Python实现的线性回归算法示例【附csv文件下载】
2018/12/29 Python
Python实现基于socket的udp传输与接收功能详解
2019/11/15 Python
Python如何爬取b站热门视频并导入Excel
2020/08/10 Python
python实现视频压缩功能
2020/12/18 Python
运动会广播稿80字
2014/01/23 职场文书
学生思想表现的评语
2014/01/30 职场文书
创业计划书模版
2014/02/05 职场文书
平安工地汇报材料
2014/08/19 职场文书
领导班子民主生活会整改措施(工商局)
2014/09/21 职场文书
护士医德考评自我评价
2015/03/03 职场文书
刑事申诉状范文
2015/05/20 职场文书
西柏坡观后感
2015/06/08 职场文书
redis调用二维码时的不断刷新排查分析
2022/04/01 Redis