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 相关文章推荐
用户的详细注册和判断
Oct 09 PHP
PHP 内存缓存加速功能memcached安装与用法
Sep 03 PHP
PHP类的静态(static)方法和静态(static)变量使用介绍
Feb 19 PHP
php中使用redis队列操作实例代码
Feb 07 PHP
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
Jun 24 PHP
php定界符
Jun 19 PHP
thinkphp的静态缓存用法分析
Nov 29 PHP
Yii学习总结之安装配置
Feb 22 PHP
php之static静态属性与静态方法实例分析
Jul 30 PHP
详解PHP的Yii框架的运行机制及其路由功能
Mar 17 PHP
php中strtotime函数性能分析
Nov 20 PHP
PHP基于新浪IP库获取IP详细地址的方法
May 04 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/02 星际争霸
PHP - Html Transfer Code
2006/10/09 PHP
PHP中删除变量时unset()和null的区别分析
2011/01/27 PHP
php用ini_get获取php.ini里变量值的方法
2015/03/04 PHP
PHP云打印类完整示例
2016/10/15 PHP
Yii2.0多文件上传实例说明
2017/07/24 PHP
JavaScript 开发规范要求(图文并茂)
2010/06/11 Javascript
学习javascript,实现插入排序实现代码
2011/07/31 Javascript
jquery.fileEveryWhere.js 一个跨浏览器的file显示插件
2011/10/24 Javascript
JavaScript sup方法入门实例(把字符串显示为上标)
2014/10/20 Javascript
js实现的四级左侧网站分类菜单实例
2015/05/06 Javascript
快速掌握Node.js中setTimeout和setInterval的使用方法
2016/03/21 Javascript
Ext JS框架程序中阻止键盘触发回退或者刷新页面的代码分享
2016/06/07 Javascript
js事件驱动机制 浏览器兼容处理方法
2016/07/23 Javascript
AngularJS教程 ng-style 指令简单示例
2016/08/03 Javascript
js基础之DOM中元素对象的属性方法详解
2016/10/28 Javascript
微信公众平台开发教程(五)详解自定义菜单
2016/12/02 Javascript
webpack配置sass模块的加载的方法
2017/07/30 Javascript
vue项目使用.env文件配置全局环境变量的方法
2019/10/24 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
2020/05/12 Javascript
从零学python系列之新版本导入httplib模块报ImportError解决方案
2014/05/23 Python
使用PDB模式调试Python程序介绍
2015/04/05 Python
动态规划之矩阵连乘问题Python实现方法
2017/11/27 Python
Python实现的读取电脑硬件信息功能示例
2018/05/30 Python
Python爬虫包BeautifulSoup异常处理(二)
2018/06/17 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
2018/11/30 Python
关于Python turtle库使用时坐标的确定方法
2020/03/19 Python
CSS3 3D旋转rotate效果实例介绍
2016/05/03 HTML / CSS
澳大利亚波希米亚风时尚品牌:Tree of Life
2019/09/15 全球购物
商务邀请函范文
2014/01/14 职场文书
社区先进事迹材料
2014/05/19 职场文书
建筑安全标语
2014/06/07 职场文书
医院志愿者活动总结
2015/05/06 职场文书
医院消毒隔离制度
2015/08/05 职场文书
2016年小学推普宣传周活动总结
2016/04/06 职场文书
Mysql中@和@@符号的详细使用指南
2022/06/05 MySQL