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 代码优化之经典示例
Mar 24 PHP
php设计模式  Command(命令模式)
Jun 17 PHP
php数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
Oct 31 PHP
Linux系统中设置多版本PHP共存配合Nginx服务器使用
Dec 21 PHP
解决yii2左侧菜单子级无法高亮问题的方法
May 08 PHP
Yii控制器中操作视图js的方法
Jul 04 PHP
比较完整的微信开发php代码
Aug 02 PHP
php7安装yar扩展的方法详解
Aug 03 PHP
使用laravel根据用户类型来显示或隐藏字段
Oct 17 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
Jan 02 PHP
详解PHP服务器如何在有限的资源里最大提升并发能力
May 25 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+java实现自动新闻滚动窗口
2006/10/09 PHP
thinkphp模板赋值与替换实例简述
2014/11/24 PHP
基于JQuery+PHP编写砸金蛋中奖程序
2015/09/08 PHP
PHP实现负载均衡下的session共用功能
2018/04/17 PHP
PHP htmlspecialchars()函数用法与实例讲解
2019/03/08 PHP
PHP如何通过带尾指针的链表实现'队列'
2020/10/22 PHP
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
2013/06/04 Javascript
Bootstrap每天必学之响应式导航、轮播图
2016/04/25 Javascript
Angular 4 指令快速入门教程
2017/06/07 Javascript
jQuery实现点击关注和取消功能
2017/07/03 jQuery
JS非行间样式获取函数的实例代码
2018/06/05 Javascript
node中的session的具体使用
2018/09/14 Javascript
jQuery实现消息弹出框效果
2019/12/10 jQuery
centos系统升级python 2.7.3
2014/07/03 Python
零基础写python爬虫之抓取糗事百科代码分享
2014/11/06 Python
浅析Python中signal包的使用
2015/11/13 Python
理解生产者消费者模型及在Python编程中的运用实例
2016/06/26 Python
浅谈SciPy中的optimize.minimize实现受限优化问题
2020/02/29 Python
python3 自动打印出最新版本执行的mysql2redis实例
2020/04/09 Python
解决python执行较大excel文件openpyxl慢问题
2020/05/15 Python
使用postMessage让 iframe自适应高度的方法示例
2019/10/08 HTML / CSS
校领导推荐信
2013/11/01 职场文书
外贸业务员工作职责
2014/01/06 职场文书
党员公开承诺践诺书
2014/03/25 职场文书
就业协议书范本
2014/04/11 职场文书
诚信的演讲稿范文
2014/05/12 职场文书
新法人代表任命书
2014/06/06 职场文书
司机岗位职责说明书
2014/07/29 职场文书
工程索赔意向书
2014/08/30 职场文书
党的群众路线教育实践活动领导班子整改方案
2014/10/25 职场文书
群众路线调研报告范文
2014/11/03 职场文书
技术股东合作协议书
2014/12/02 职场文书
拿破仑传读书笔记
2015/07/01 职场文书
详解Django中 render() 函数的使用方法
2021/04/22 Python
苹果的回收机器人可以通过拆解iPhone获取大量的金和铜并外公布了环境保护最新进展
2022/04/21 数码科技
阿里面试Nacos配置中心交互模型是push还是pull原理解析
2022/07/23 Java/Android