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 相关文章推荐
一个很方便的 XML 类!!原创的噢
Oct 09 PHP
解决phpmyadmin 乱码,支持gb2312和utf-8
Nov 20 PHP
php 一元分词算法
Nov 30 PHP
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
Nov 21 PHP
PHP 面向对象详解
Sep 13 PHP
PHP、Python和Javascript的装饰器模式对比
Feb 03 PHP
php简单统计在线人数的方法
May 10 PHP
你不知道的文件上传漏洞php代码分析
Sep 29 PHP
php+mysql+jquery实现日历签到功能
Feb 27 PHP
PHP中快速生成随机密码的几种方式
Apr 17 PHP
PHP树形结构tree类用法示例
Feb 01 PHP
PHP实现Markdown文章上传到七牛图床的实例内容
Feb 11 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
在WIN98下以apache模块方式安装php
2006/10/09 PHP
thinkphp中html:list标签传递多个参数实例
2014/10/30 PHP
php给图片添加文字水印方法汇总
2015/08/27 PHP
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
jquery获取checkbox的值并post提交
2015/01/14 Javascript
JQuery+EasyUI轻松实现步骤条效果
2016/02/22 Javascript
JS平滑无缝滚动效果的实现代码
2016/05/06 Javascript
总结jQuery插件开发中的一些要点
2016/05/16 Javascript
基于JS实现类似支付宝支付密码输入框
2016/09/02 Javascript
Jquery 整理元素选取、常用方法一览表
2016/11/26 Javascript
bootstrap table sum总数量统计实现方法
2017/10/29 Javascript
浅谈vue-router 路由传参的方法
2017/12/27 Javascript
浅析vue深复制
2018/01/29 Javascript
浅谈redux, koa, express 中间件实现对比解析
2019/05/23 Javascript
javascript操作元素的常见方法小结
2019/11/13 Javascript
nodeJs项目在阿里云的简单部署
2020/11/27 NodeJs
原生JS实现pc端轮播图效果
2020/12/21 Javascript
[01:19:46]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
python处理中文编码和判断编码示例
2014/02/26 Python
python生成日历实例解析
2014/08/21 Python
Python version 2.7 required, which was not found in the registry
2014/08/26 Python
详解Python3中yield生成器的用法
2015/08/20 Python
Python中的sort()方法使用基础教程
2017/01/08 Python
Python实现按逗号分隔列表的方法
2018/10/23 Python
python3.4 将16进制转成字符串的实例
2019/06/12 Python
浅谈python累加求和+奇偶数求和_break_continue
2020/02/25 Python
初学者学习Python好还是Java好
2020/05/26 Python
体验完美剃须:The Art of Shaving
2018/08/06 全球购物
Elizabeth Gage官网:英国最好的珠宝设计之一
2020/09/26 全球购物
J2EE面试题
2016/03/14 面试题
酒店前厅员工辞职信
2014/01/08 职场文书
骨干教师考核方案
2014/05/09 职场文书
班级活动总结格式
2014/08/30 职场文书
2014年服务行业工作总结
2014/11/18 职场文书
物业客服专员岗位职责
2015/04/07 职场文书
SQL Server中T-SQL标识符介绍与无排序生成序号的方法
2022/05/25 SQL Server