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中,文件上传
Dec 06 PHP
php中iconv函数使用方法
May 24 PHP
PHP数据类型之布尔型的介绍
Apr 28 PHP
使用PHP curl模拟浏览器抓取网站信息
Oct 28 PHP
php中sql注入漏洞示例 sql注入漏洞修复
Jan 24 PHP
PHP函数extension_loaded()用法实例
Jan 19 PHP
PHP使用DirectoryIterator显示下拉文件列表的方法
Mar 13 PHP
PHP实现GIF图片验证码
Nov 04 PHP
php版微信公众平台接口开发之智能回复开发教程
Sep 22 PHP
thinkPHP实现的联动菜单功能详解
May 05 PHP
PHP多进程之pcntl_fork的实例详解
Oct 15 PHP
Laravel路由研究之domain解决多域名问题的方法示例
Apr 04 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+AJAX实现无刷新注册(带用户名实时检测)
2007/01/02 PHP
PHP入门速成教程
2007/03/19 PHP
删除无限分类并同时删除它下面的所有子分类的方法
2010/08/08 PHP
表格展示无限级分类(PHP版)
2012/08/21 PHP
解析如何用php screw加密php源代码
2013/06/20 PHP
php实现网页缓存的工具类分享
2015/07/14 PHP
浅谈PHP中静态方法和非静态方法的相互调用
2016/10/04 PHP
js获取当月最后一天实例代码
2013/11/19 Javascript
javascript修改表格背景色实例代码分享
2013/12/10 Javascript
基于Jquery实现键盘按键监听
2014/05/11 Javascript
一款基于jQuery的图片场景标注提示弹窗特效
2015/01/05 Javascript
使用纯javascript实现经典扫雷游戏
2015/04/23 Javascript
jQuery zclip插件实现跨浏览器复制功能
2015/11/02 Javascript
jQuery提示插件qTip2用法分析(支持ajax及多种样式)
2016/06/08 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
2017/04/25 Javascript
jQuery操作css样式
2017/05/15 jQuery
详解Angular2表单-模板驱动的表单(Template-Driven Forms)
2017/08/04 Javascript
requireJS模块化实现返回顶部功能的方法详解
2017/10/16 Javascript
引入外部js脚本加载慢与页面白屏问题的解决
2018/12/10 Javascript
JavaScript Math对象和调试程序的方法分析
2019/05/13 Javascript
javascript系统时间设置操作示例
2019/06/17 Javascript
jQuery zTree插件快速实现目录树
2019/08/16 jQuery
基于javascript处理二进制图片流过程详解
2020/06/08 Javascript
Node.js path模块,获取文件后缀名操作
2020/11/07 Javascript
tensorflow更改变量的值实例
2018/07/30 Python
详解如何在Apache中运行Python WSGI应用
2019/01/02 Python
python读取图片的方式,以及将图片以三维数组的形式输出方法
2019/07/03 Python
用Python批量把文件复制到另一个文件夹的实现方法
2019/08/16 Python
安装PyInstaller失败问题解决
2019/12/14 Python
python实现提取COCO,VOC数据集中特定的类
2020/03/10 Python
HTML5 video 视频标签使用介绍
2014/02/03 HTML / CSS
美国最大的宠物用品零售商:PetSmart
2016/11/14 全球购物
酒店执行总经理岗位职责
2013/12/15 职场文书
大学生的自我鉴定范文
2014/01/21 职场文书
新教师培训方案
2014/06/08 职场文书
SQLServer中exists和except用法介绍
2021/12/04 SQL Server