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(3)
Oct 09 PHP
web方式ftp
Oct 09 PHP
深入理解:单一入口、MVC、ORM、CURD、ActiveRecord概念
Jun 06 PHP
浅析PHP substr,mb_substr以及mb_strcut的区别和用法
Jun 21 PHP
PHP使用正则表达式清除超链接文本
Nov 12 PHP
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
Nov 19 PHP
ThinkPHP中关联查询实例
Dec 02 PHP
PHP长连接实现与使用方法详解
Feb 11 PHP
Laravel框架在本地虚拟机快速安装的方法详解
Jun 11 PHP
Laravel源码解析之路由的使用和示例详解
Sep 27 PHP
Smarty模板类内部原理实例分析
Jul 03 PHP
php的命名空间与自动加载实现方法
Aug 25 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
百事可乐也出咖啡了 双倍咖啡因双倍快乐
2021/03/03 咖啡文化
类的另类用法--数据的封装
2006/10/09 PHP
PHP脚本数据库功能详解(上)
2006/10/09 PHP
drupal 代码实现URL重写
2011/05/04 PHP
php遍历所有文件及文件夹的方法深入解析
2013/06/08 PHP
浅谈PHP eval()函数定义和用法
2016/06/21 PHP
php 数据结构之链表队列
2017/10/17 PHP
js 判断脚本加载完毕的代码
2011/07/13 Javascript
JQuery中使用Ajax赋值给全局变量异常的解决方法
2014/01/10 Javascript
JS实现图片高亮展示效果实例
2015/11/24 Javascript
AngularJS 输入验证详解及实例代码
2016/07/28 Javascript
js提示框替代系统alert,自动关闭alert对话框的实现方法
2016/11/07 Javascript
js 实现省市区三级联动菜单效果
2017/02/20 Javascript
jQuery中绑定事件bind() on() live() one()的异同
2017/02/23 Javascript
jQuery实现的form转json经典示例
2017/10/10 jQuery
AngularJS标签页tab选项卡切换功能经典实例详解
2018/05/16 Javascript
JS面试题大坑之隐式类型转换实例代码
2018/10/14 Javascript
js中offset,client , scroll 三大元素知识点总结
2019/09/11 Javascript
python mysqldb连接数据库
2009/03/16 Python
python按照多个字符对字符串进行分割的方法
2015/03/17 Python
Python性能提升之延迟初始化
2016/12/04 Python
Numpy 将二维图像矩阵转换为一维向量的方法
2018/06/05 Python
Anaconda下配置python+opencv+contribx的实例讲解
2018/08/06 Python
python 实现单通道转3通道
2019/12/03 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
2020/02/14 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
Sunglasses Shop德国站:欧洲排名第一的太阳镜网站
2017/08/01 全球购物
shell的种类有哪些
2015/04/15 面试题
体育教育个人自荐信范文
2013/12/01 职场文书
企业厂务公开实施方案
2014/03/26 职场文书
2014年专项整治工作总结
2014/11/17 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
政协常委会议主持词
2015/07/03 职场文书
python中sqllite插入numpy数组到数据库的实现方法
2021/06/21 Python
如何创建一个创建MySQL数据库中的datetime类型
2022/03/21 MySQL
MySQL数据库实验之 触发器和存储过程
2022/06/21 MySQL