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实现网站插件机制的方法
Nov 10 PHP
php检测用户是否用手机(Mobile)访问网站的类
Jan 09 PHP
CodeIgniter实现更改view文件夹路径的方法
Jul 04 PHP
PHP函数in_array()使用详解
Aug 20 PHP
php中字符串和正则表达式详解
Oct 23 PHP
javascript some()函数用法详解
Nov 13 PHP
phpmyadmin提示The mbstring extension is missing的解决方法
Dec 17 PHP
Codeigniter检测表单post数据的方法
Mar 21 PHP
php分割合并两个字符串的函数实例
Jun 19 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
Mar 02 PHP
浅谈PHP中类和对象的相关函数
Apr 26 PHP
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
Feb 15 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
把77A收信机改造成收音机
2021/03/02 无线电
火车头discuz6.1 完美采集的php接口文件
2009/09/13 PHP
PHP调用Linux的命令行执行文件压缩命令
2013/01/27 PHP
模仿JQuery sortable效果 代码有错但值得看看
2009/11/05 Javascript
jquery关于图形报表的运用实现代码
2011/01/06 Javascript
从jquery的过滤器.filter()方法想到的
2013/09/29 Javascript
jQuery入门介绍之基础知识
2015/01/13 Javascript
浅析函数声明和函数表达式——函数声明的声明提前
2016/05/03 Javascript
Winform客户端向web地址传参接收参数的方法
2016/05/17 Javascript
关于javascript原型的修改与重写(覆盖)差别详解
2016/08/31 Javascript
Bootstrap风格的zTree右键菜单
2017/02/17 Javascript
vue组件发布到npm简单步骤
2017/11/30 Javascript
仿京东快报向上滚动的实例
2017/12/13 Javascript
vue2.0页面前进刷新回退不刷新的实现方法
2018/07/31 Javascript
vue实例中data使用return包裹的方法
2018/08/27 Javascript
浅谈webpack SplitChunksPlugin实用指南
2018/09/17 Javascript
小程序视频或音频自定义可拖拽进度条的示例代码
2018/09/30 Javascript
实例介绍JavaScript中多种组合继承
2019/01/20 Javascript
JavaScript常用事件介绍
2019/01/21 Javascript
小程序scroll-view安卓机隐藏横向滚动条的实现详解
2019/05/16 Javascript
vue.js 实现a标签href里添加参数
2019/11/12 Javascript
基于better-scroll 实现歌词联动功能的代码
2020/05/07 Javascript
如何使用jQuery操作Cookies方法解析
2020/09/08 jQuery
Python的Flask开发框架简单上手笔记
2015/11/16 Python
python实现五子棋游戏
2019/06/18 Python
python Django中models进行模糊查询的示例
2019/07/18 Python
HelloFresh澳大利亚:订购你的美味食品盒、健康餐食
2018/03/28 全球购物
英国最大最好的无人机商店:Drones Direct
2019/07/12 全球购物
新闻编辑自荐信
2013/11/03 职场文书
大学学习生活感言
2014/01/18 职场文书
护理目标管理责任书
2014/07/25 职场文书
高三毕业感言
2015/07/30 职场文书
小程序后台PHP版本部署运行 LNMP+WNMP
2021/04/01 Servers
教你怎么用python selenium实现自动化测试
2021/05/27 Python
React Native项目框架搭建的一些心得体会
2021/05/28 Javascript
新手初学Java网络编程
2021/07/07 Java/Android