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 相关文章推荐
UCenter Home二次开发指南
May 28 PHP
phpinfo 系统查看参数函数代码
Jun 05 PHP
在PHP中操作Excel实例代码
Apr 29 PHP
实例讲解PHP面向对象之多态
Aug 20 PHP
php使用ereg验证文件上传的方法
Dec 16 PHP
php获取远程文件内容的函数
Nov 02 PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
Jan 07 PHP
php批量删除操作代码分享
Feb 26 PHP
PHP两种实现无级递归分类的方法
Mar 02 PHP
PHP回调函数与匿名函数实例详解
Aug 16 PHP
PHP如何通过date() 函数格式化显示时间
Nov 13 PHP
PHP基于进程控制函数实现多线程
Dec 09 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
javascript中的self和this用法小结
2014/02/08 Javascript
基于PHP和Mysql相结合使用jqGrid读取数据并显示
2015/12/02 Javascript
jquery zTree异步加载简单实例讲解
2016/02/25 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
2016/05/16 Javascript
js 性能优化之算法和流程控制
2017/02/15 Javascript
JS简单实现获取元素的封装操作示例
2017/04/07 Javascript
Javascript中八种遍历方法的执行速度深度对比
2017/04/25 Javascript
node.js利用mongoose获取mongodb数据的格式化问题详解
2017/10/06 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
2017/11/17 Javascript
JS实现简单的浮动碰撞效果示例
2017/12/28 Javascript
JS中offset和匀速动画详解
2018/02/06 Javascript
vue-cli 如何打包上线的方法示例
2018/05/08 Javascript
微信小程序下拉框功能的实例代码
2018/11/06 Javascript
在node环境下parse Smarty模板的使用示例代码
2019/11/15 Javascript
[01:18:45]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第三场2月1日
2021/03/11 DOTA
python进阶教程之词典、字典、dict
2014/08/29 Python
Python使用scrapy抓取网站sitemap信息的方法
2015/04/08 Python
Python读写配置文件的方法
2015/06/03 Python
Python中functools模块的常用函数解析
2016/06/30 Python
Django数据库表反向生成实例解析
2018/02/06 Python
python随机数分布random测试
2018/08/27 Python
Python中如何导入类示例详解
2019/04/17 Python
python+selenium select下拉选择框定位处理方法
2019/08/24 Python
对python中assert、isinstance的用法详解
2019/11/27 Python
pytorch 多分类问题,计算百分比操作
2020/07/09 Python
Python实现微信表情包炸群功能
2021/01/28 Python
阿玛瑞酒店中文官方网站:Amari.com
2018/02/13 全球购物
财务会计专业推荐信
2013/11/30 职场文书
申报职称专业技术个人的自我评价
2013/12/12 职场文书
检举信的格式及范文
2014/04/04 职场文书
家属答谢词
2015/01/05 职场文书
实习生个人总结范文
2015/02/28 职场文书
行政答辩状范文
2015/05/21 职场文书
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
2021/06/22 Python
使用Oracle跟踪文件的问题详解
2021/06/28 Oracle
《总之就是很可爱》新作短篇动画《总之就是很可爱~制服~》将于2022年夏天播出
2022/04/07 日漫