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+mysql来做一个功能强大的在线计算器
Oct 12 PHP
php中防止伪造跨站请求的小招式
Sep 02 PHP
php cc攻击代码与防范方法
Oct 18 PHP
php实现两个数组相加的方法
Feb 17 PHP
php实现对象克隆的方法
Jun 20 PHP
php删除数组中重复元素的方法
Dec 22 PHP
thinkPHP5.0框架自动加载机制分析
Mar 18 PHP
PHP实现微信红包金额拆分试玩的算法示例
Apr 07 PHP
PHP堆栈调试操作简单示例
Jun 15 PHP
详解关于php的xdebug配置(编辑器vscode)
Jan 29 PHP
Laravel实现ORM带条件搜索分页
Oct 24 PHP
WordPress免插件实现面包屑导航的示例代码
Aug 20 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读取csv文件内容的详解
2013/06/18 PHP
PHP命名空间和自动加载类
2016/04/03 PHP
php简单统计在线人数的方法
2016/05/10 PHP
Web版彷 Visual Studio 2003 颜色选择器
2007/01/09 Javascript
js 数组去重的四种实用方法
2014/09/09 Javascript
JavaScript通过元素索引号删除数组中对应元素的方法
2015/03/18 Javascript
WebGL利用FBO完成立方体贴图效果完整实例(附demo源码下载)
2016/01/26 Javascript
React.js入门实例教程之创建hello world 的5种方式
2016/05/11 Javascript
实例解析Array和String方法
2016/12/14 Javascript
javascript实现多张图片左右无缝滚动效果
2017/03/22 Javascript
Require.js的基本用法详解
2017/07/03 Javascript
基于JavaScript中字符串的match与replace方法(详解)
2017/12/04 Javascript
JS原型与继承操作示例
2019/05/09 Javascript
JavaScript数值类型知识汇总
2019/11/17 Javascript
解决微信授权成功后点击按返回键出现空白页和报错的问题
2020/06/08 Javascript
[02:41]DOTA2英雄基础教程 冥魂大帝
2014/01/16 DOTA
[05:02]2014DOTA2 TI中国区预选赛精彩TOPPLAY第三弹
2014/06/25 DOTA
在IIS服务器上以CGI方式运行Python脚本的教程
2015/04/25 Python
轻松掌握python设计模式之策略模式
2016/11/18 Python
python爬虫自动创建文件夹的功能
2018/08/01 Python
Python中创建二维数组
2018/10/17 Python
Python cv2 图像自适应灰度直方图均衡化处理方法
2018/12/07 Python
Python 按字典dict的键排序,并取出相应的键值放于list中的实例
2019/02/12 Python
python3.6连接mysql数据库及增删改查操作详解
2020/02/10 Python
Python私有属性私有方法应用实例解析
2020/09/15 Python
使用CSS3的::selection改变选中文本颜色的方法
2015/09/29 HTML / CSS
详解HTML5中CSS外观属性
2020/09/10 HTML / CSS
AE美国鹰美国官方网站:American Eagle Outfitters
2016/08/22 全球购物
高中生职业规划范文
2014/03/09 职场文书
房产继承公证书
2014/04/09 职场文书
学校联谊协议书
2014/09/16 职场文书
党员学习群众路线教育实践活动对照检查材料
2014/09/23 职场文书
2014年环境卫生工作总结
2014/11/24 职场文书
2015年党风廉政建设个人总结
2015/08/18 职场文书
Lombok的详细使用及优缺点总结
2021/07/15 Java/Android
MyBatis自定义SQL拦截器示例详解
2021/10/24 Java/Android