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 相关文章推荐
MySQL数据源表结构图示
Jun 05 PHP
php中通过数组进行高效随机抽取指定条记录的算法
Sep 09 PHP
ThinkPHP模板IF标签用法详解
Jul 01 PHP
PHP连接sql server 2005环境配置及问题解决
Aug 08 PHP
php实现utf-8转unicode函数分享
Jan 06 PHP
php通过array_push()函数添加多个变量到数组末尾的方法
Mar 18 PHP
PHP实现简单搜歌的方法
Jul 28 PHP
基于PHP实现简单的随机抽奖小程序
Jan 05 PHP
PHP实现163邮箱自动发送邮件
Mar 29 PHP
PHP addAttribute()函数讲解
Feb 03 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
Dec 02 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
Dec 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超级全局变量数组小结
2012/10/04 PHP
php存储过程调用实例代码
2013/02/03 PHP
三种php连接access数据库方法
2013/11/11 PHP
PHP生成树的方法
2015/07/28 PHP
javascript 支持链式调用的异步调用框架Async.Operation
2009/08/04 Javascript
js弹出层之1:JQuery.Boxy (二)
2011/10/06 Javascript
jquery 插件学习(五)
2012/08/06 Javascript
javascript无刷新评论实现方法
2015/05/13 Javascript
nodejs爬虫抓取数据之编码问题
2015/07/03 NodeJs
jQuery niceScroll滚动条错位问题的解决方法
2018/02/03 jQuery
vue实现多级菜单效果
2019/10/19 Javascript
ant-design-vue 时间选择器赋值默认时间的操作
2020/10/27 Javascript
基于JavaScript实现简单的轮播图
2021/03/03 Javascript
[35:34]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python检测网站链接是否已存在
2016/04/07 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
Python爬虫抓取技术的一些经验
2019/07/12 Python
Keras 中Leaky ReLU等高级激活函数的用法
2020/07/05 Python
Python在后台自动解压各种压缩文件的实现方法
2020/11/10 Python
python中if嵌套命令实例讲解
2021/02/25 Python
网络工程与软件技术毕业生自荐信
2013/09/24 职场文书
机电一体化自荐信
2013/12/10 职场文书
办公室内勤工作职责
2013/12/11 职场文书
初中化学教学反思
2014/01/23 职场文书
化妆品店促销方案
2014/02/24 职场文书
《小小竹排画中游》教学反思
2014/02/26 职场文书
幼儿园师德演讲稿
2014/05/06 职场文书
学校工作推荐信范文
2014/07/11 职场文书
2014年乡镇党建工作总结
2014/11/11 职场文书
2014年客户经理工作总结
2014/11/20 职场文书
2014年扫黄打非工作总结
2014/12/03 职场文书
仓库保管员岗位职责
2015/02/09 职场文书
少先队中队工作总结
2015/08/14 职场文书
Django路由层如何获取正确的url
2021/07/15 Python
使用CSS设置滚动条样式
2022/01/18 HTML / CSS
python模拟浏览器 使用selenium进入好友QQ空间并留言
2022/04/12 Python