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中对数据库操作的封装
Oct 09 PHP
PHP的分页功能
Mar 21 PHP
用PHP连接MySQL代码的参数说明
Jun 07 PHP
PHP中ob_start函数的使用说明
Nov 11 PHP
thinkphp中html:list标签传递多个参数实例
Oct 30 PHP
一个完整的PHP类包含的七种语法说明
Jun 04 PHP
WordPress中转义HTML与过滤链接的相关PHP函数使用解析
Dec 22 PHP
PHP和MySql中32位和64位的整形范围是多少
Feb 18 PHP
PHP数组实例详解
Jun 26 PHP
PHP实现Google plus的好友拖拽分组效果
Oct 21 PHP
PHP折半(二分)查找算法实例分析
May 12 PHP
浅谈如何提高PHP代码质量之单元测试
May 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
php使用pdo连接报错Connection failed SQLSTATE的解决方法
2014/12/15 PHP
浅谈thinkphp的实例化模型
2015/01/04 PHP
PHP中is_dir()函数使用指南
2015/05/08 PHP
php采用session实现防止页面重复刷新
2015/12/24 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
2016/01/22 PHP
PHP实现实时生成并下载超大数据量的EXCEL文件详解
2017/10/23 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
2020/05/29 PHP
jQuery 前的按键判断代码
2010/03/19 Javascript
Javascript中Event属性搜集整理
2013/09/17 Javascript
BootStrap实现树形目录组件代码详解
2016/06/21 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
jQuery动态移除和添加背景图片的方法详解
2017/03/07 Javascript
React Native时间转换格式工具类分享
2017/10/24 Javascript
mui back 返回刷新页面的实例
2017/12/06 Javascript
不使用JavaScript实现菜单的打开和关闭效果demo
2018/05/01 Javascript
vue-cli2 构建速度优化的实现方法
2019/01/08 Javascript
Element中Slider滑块的具体使用
2020/07/29 Javascript
在vs code 中如何创建一个自己的 Vue 模板代码
2020/11/10 Javascript
vue 在服务器端直接修改请求的接口地址
2020/12/19 Vue.js
[02:50]【扭转乾坤,只此一招】DOTA2永雾林渊版本开启新篇章
2020/12/22 DOTA
Python中的引用和拷贝浅析
2014/11/22 Python
使用Python下的XSLT API进行web开发的简单教程
2015/04/15 Python
Python爬取三国演义的实现方法
2016/09/12 Python
python面向对象_详谈类的继承与方法的重载
2017/06/07 Python
python通过百度地图API获取某地址的经纬度详解
2018/01/28 Python
Django接收自定义http header过程详解
2019/08/23 Python
Python tkinter布局与按钮间距设置方式
2020/03/04 Python
python导入库的具体方法
2020/06/18 Python
美丽的珠宝配饰:SmallThings
2019/09/04 全球购物
毕业生自荐书
2014/02/03 职场文书
体育教师求职信
2014/05/24 职场文书
工作检讨书怎么写
2015/01/23 职场文书
环卫工人慰问信
2015/02/15 职场文书
2015年学生会干事工作总结
2015/04/09 职场文书
合理化建议书范文
2015/09/14 职场文书
Vertica集成Apache Hudi重磅使用指南
2022/03/31 Servers