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 相关文章推荐
php5 and xml示例
Nov 22 PHP
个人站长制做网页常用的php代码
Mar 03 PHP
IIS下PHP连接数据库提示mysql undefined function mysql_connect()
Jun 04 PHP
php模板函数 正则实现代码
Oct 15 PHP
浅析php与数据库代码开发规范
Aug 08 PHP
PHP中的traits实现代码复用使用实例
May 13 PHP
Zend Studio使用技巧两则
Apr 01 PHP
PHP获取真实客户端的真实IP
Mar 07 PHP
Laravel5.* 打印出执行的sql语句的方法
Jul 24 PHP
PHP命名空间与自动加载类详解
Sep 04 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
Aug 05 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
Sep 18 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
默默简单的写了一个模板引擎
2007/01/02 PHP
php计算当前程序执行时间示例
2014/04/24 PHP
PHP内核探索之变量
2015/12/22 PHP
分析PHP中单双引号的误区和双引号小隐患
2016/07/19 PHP
利用PHP获取汉字首字母并且分组排序详解
2017/10/22 PHP
php use和include区别总结
2019/10/13 PHP
JavaScript 组件之旅(三):用 Ant 构建组件
2009/10/28 Javascript
JavaScript格式化数字的函数代码
2010/11/30 Javascript
js的回调函数详解
2015/01/05 Javascript
JavaScript将字符串转换为整数的方法
2015/04/14 Javascript
javascript中的五种基本数据类型
2015/08/26 Javascript
Jquery元素追加和删除的实现方法
2016/05/24 Javascript
H5移动端图片压缩上传开发流程
2016/11/09 Javascript
jQuery实现checkbox列表的全选、反选功能
2016/11/24 Javascript
JS数组搜索之折半搜索实现方法分析
2017/03/27 Javascript
基于angular实现模拟微信小程序swiper组件
2017/06/11 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
2017/07/05 Javascript
vue一步步实现alert功能
2017/07/05 Javascript
详解jquery选择器的原理
2017/08/01 jQuery
浅谈vue-router路由切换 组件重用挖下的坑
2019/11/01 Javascript
通过实例解析chrome如何在mac环境中安装vue-devtools插件
2020/07/10 Javascript
跟老齐学Python之关于类的初步认识
2014/10/11 Python
Python使用crontab模块设置和清除定时任务操作详解
2019/04/09 Python
python3获取当前目录的实现方法
2019/07/29 Python
Python+logging输出到屏幕将log日志写入文件
2020/11/11 Python
澳洲网红粉泥面膜:Sand & Sky
2019/08/13 全球购物
美国精品地毯网站:Boutique Rugs
2020/03/04 全球购物
Python如何实现单例模式
2016/06/03 面试题
介绍一些UNIX常用简单命令
2014/11/11 面试题
采购内勤岗位职责
2013/12/10 职场文书
厉行勤俭节约倡议书
2014/05/16 职场文书
销售员态度差检讨书
2014/10/26 职场文书
2014年最新版离婚协议书范本
2014/11/25 职场文书
集结号观后感
2015/06/08 职场文书
2017春节晚会开幕词
2016/03/03 职场文书
什么是检讨书?检讨书的格式及范文
2019/11/05 职场文书