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中iconv函数使用方法
May 24 PHP
php 设计模式之 工厂模式
Dec 19 PHP
php侧拉菜单 漂亮,可以向右或者向左展开,支持FF,IE
Oct 15 PHP
PHP设计模式之装饰者模式
Feb 29 PHP
探讨php中遍历二维数组的几种方法详解
Jun 08 PHP
php调整服务器时间的方法
Apr 03 PHP
PHPExcel简单读取excel文件示例
May 26 PHP
PHP简单实现欧拉函数Euler功能示例
Nov 06 PHP
Laravel多域名下字段验证的方法
Apr 04 PHP
PHP 7.4中使用预加载的方法详解
Jul 08 PHP
laravel框架中表单请求类型和CSRF防护实例分析
Nov 23 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
Feb 27 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 简单数组排序实现代码
2009/08/05 PHP
php array_filter除去数组中的空字符元素
2020/06/21 PHP
php5.3 goto函数介绍和示例
2014/03/21 PHP
PHP批量修改文件名称的方法分析
2017/02/27 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
2017/09/01 PHP
javascript 面向对象编程 万物皆对象
2009/09/17 Javascript
js定时器怎么写?就是在特定时间执行某段程序
2013/10/11 Javascript
js判断客户端是iOS还是Android等移动终端的方法
2013/12/11 Javascript
使用jquery.validate自定义方法实现&quot;手机号码或者固话至少填写一个&quot;的逻辑验证
2014/09/01 Javascript
基于jQuery实现的图片切换焦点图整理
2014/12/07 Javascript
jQuery实现ichat在线客服插件
2014/12/29 Javascript
JavaScript学习笔记之内置对象
2015/01/22 Javascript
详解Vue2+Echarts实现多种图表数据可视化Dashboard(附源码)
2017/03/21 Javascript
js构建二叉树进行数值数组的去重与优化详解
2018/03/26 Javascript
玩转Koa之koa-router原理解析
2018/12/29 Javascript
微信小程序使用wx.request请求服务器json数据并渲染到页面操作示例
2019/03/30 Javascript
一个手写的vue放大镜效果
2019/08/09 Javascript
微信小程序实现一个简单swiper代码实例
2019/12/30 Javascript
Node登录权限验证token验证实现的方法示例
2020/05/25 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
2020/10/02 Javascript
Vue自定义表单内容检查rules实例
2020/10/30 Javascript
python读取json文件并将数据插入到mongodb的方法
2015/03/23 Python
Python3中urlencode和urldecode的用法详解
2019/07/23 Python
Python:合并两个numpy矩阵的实现
2019/12/02 Python
使用python去除图片白色像素的实例
2019/12/12 Python
CentOS7下安装python3.6.8的教程详解
2020/01/03 Python
python3用urllib抓取贴吧邮箱和QQ实例
2020/03/10 Python
获取邓白氏信用报告:Dun & Bradstreet
2019/01/22 全球购物
介绍一下JMS编程步骤
2015/09/22 面试题
三年级学生评语
2014/04/23 职场文书
观看信仰心得体会
2014/09/04 职场文书
在职员工证明书
2014/09/19 职场文书
法律意见书范本
2015/06/04 职场文书
关于企业的执行力标语大全
2020/01/06 职场文书
anaconda python3.8安装后降级
2021/06/11 Python
NoSQL优缺点与MongoDB数据库简介
2022/06/05 MongoDB