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+DBM的同学录程序(5)
Oct 09 PHP
PHP 数字左侧自动补0
Mar 31 PHP
php配置php-fpm启动参数及配置详解
Nov 04 PHP
Yii框架中memcache用法实例
Dec 03 PHP
PHP使用gmdate实现将一个UNIX 时间格式化成GMT文本的方法
Mar 19 PHP
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
Aug 25 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
Sep 10 PHP
php实现图片上传、剪切功能
May 07 PHP
php微信公众平台开发之微信群发信息
Sep 13 PHP
PHP仿微信发红包领红包效果
Oct 30 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
Mar 26 PHP
如何在Laravel之外使用illuminate组件详解
Sep 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+mysql 采用ajax技术的 省 市 地 3级联动无刷新菜单 源码
2006/12/16 PHP
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
2013/06/29 PHP
php使用百度天气接口示例
2014/04/22 PHP
ThinkPHP框架设计及扩展详解
2014/11/25 PHP
php利用scws实现mysql全文搜索功能的方法
2014/12/25 PHP
jQuery 位置插件
2008/12/25 Javascript
js获取单元格自定义属性值的代码(IE/Firefox)
2010/04/05 Javascript
Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)
2011/06/27 Javascript
一个JQuery写的点击上下滚动的小例子
2011/08/27 Javascript
通过JS自动隐藏手机浏览器的地址栏实现原理与代码
2013/01/02 Javascript
Node.js中使用事件发射器模式实现事件绑定详解
2014/08/15 Javascript
javascript中replace使用方法总结
2017/03/01 Javascript
详解JavaScript调用栈、尾递归和手动优化
2017/06/03 Javascript
JS点击动态添加标签、删除指定标签的代码
2018/04/18 Javascript
vuejs router history 配置到iis的方法
2018/09/20 Javascript
Vue实现一个无限加载列表功能
2018/11/13 Javascript
[55:18]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[41:13]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第一场 11.20
2020/11/20 DOTA
Python 爬虫爬取指定博客的所有文章
2016/02/17 Python
Python跨文件全局变量的实现方法示例
2017/12/10 Python
Python+OpenCV实现车牌字符分割和识别
2018/03/31 Python
详解从Django Rest Framework响应中删除空字段
2019/01/11 Python
解决pyinstaller打包发布后的exe文件打开控制台闪退的问题
2019/06/21 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
2020/02/26 Python
Python生成随机验证码代码实例解析
2020/06/09 Python
宝拉珍选美国官网:Paula’s Choice美国
2018/01/07 全球购物
印度首选时尚目的地:Reliance Trends
2018/01/17 全球购物
法国在线药房:DoctiPharma
2020/10/21 全球购物
银行求职信范文
2014/05/26 职场文书
生日庆典策划方案
2014/06/02 职场文书
领导班子民主生活会整改措施(工商局)
2014/09/21 职场文书
2014年销售工作总结与计划
2014/12/01 职场文书
二年级上册数学教学计划
2015/01/20 职场文书
springboot集成springCloud中gateway时启动报错的解决
2021/07/16 Java/Android
使用jpa之动态插入与修改(重写save)
2021/11/23 Java/Android
WinServer2012搭建DNS服务器的方法步骤
2022/06/10 Servers