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 sprintf()函数让你的sql操作更安全
Jul 23 PHP
php中去除所有js,html,css代码
Oct 12 PHP
PHP性能优化准备篇图解PEAR安装
Dec 05 PHP
PHP面向对象——访问修饰符介绍
Nov 08 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
Jul 05 PHP
php中try catch捕获异常实例详解
Nov 21 PHP
PHP实现扎金花游戏之大小比赛的方法
Mar 10 PHP
PHP日期函数date格式化UNIX时间的方法
Mar 19 PHP
PHP多种序列化/反序列化的方法详解
Jun 23 PHP
PHP基于SimpleXML生成和解析xml的方法示例
Jul 17 PHP
PDO操作MySQL的基础教程(推荐)
Aug 18 PHP
PHP堆栈调试操作简单示例
Jun 15 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/06/25 PHP
PHP输出缓冲控制Output Control系列函数详解
2015/07/02 PHP
ThinkPHP发送邮件示例代码
2016/10/08 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
PHP xpath()函数讲解
2019/02/11 PHP
用JTrackBar实现的模拟苹果风格的滚动条
2007/08/06 Javascript
JS操作select下拉框动态变动(创建/删除/获取)
2013/06/02 Javascript
js 删除数组的几种方法小结
2014/02/21 Javascript
vue 的点击事件获取当前点击的元素方法
2018/09/15 Javascript
[01:00:06]加油DOTA_EP01_网络版
2014/08/09 DOTA
Python命名空间详解
2014/08/18 Python
python字符串排序方法
2014/08/29 Python
Python中的__new__与__init__魔术方法理解笔记
2014/11/08 Python
python 对key为时间的dict排序方法
2018/10/17 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
2019/07/23 Python
python实现屏保程序(适用于背单词)
2019/07/30 Python
对Django中内置的User模型实例详解
2019/08/16 Python
Python 输出详细的异常信息(traceback)方式
2020/04/08 Python
python开发一款翻译工具
2020/10/10 Python
关于css中margin的值和垂直外边距重叠问题
2020/10/27 HTML / CSS
惠普香港官方商店:HP香港
2019/04/30 全球购物
StubHub澳大利亚:购买或出售您的门票
2019/08/01 全球购物
编写一个类体现构造,公有,私有方法,静态,私有变量
2013/08/10 面试题
商务专员岗位职责
2013/11/23 职场文书
毕业生就业自荐信
2013/12/04 职场文书
实习评语
2013/12/16 职场文书
九月份红领巾广播稿
2014/01/22 职场文书
学校消防安全制度
2014/01/30 职场文书
英语专业毕业生求职信
2014/05/24 职场文书
关于教师节的广播稿
2014/09/10 职场文书
社区干部培训心得体会
2016/01/06 职场文书
导游词之无锡东林书院
2019/12/11 职场文书
MySQL完整性约束的定义与实例教程
2021/05/30 MySQL
在js中修改html body的样式
2021/11/11 Javascript
Unicode中的CJK(中日韩统一表意文字)字符小结
2021/12/06 HTML / CSS
Java 常见的限流算法详细分析并实现
2022/04/07 Java/Android