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 相关文章推荐
简单示例AJAX结合PHP代码实现登录效果代码
Jul 25 PHP
利用php+mcDropdown实现文件路径可在下拉框选择
Aug 07 PHP
使用phpQuery采集网页的方法
Nov 13 PHP
5种PHP创建数组的实例代码分享
Jan 17 PHP
PHP计算百度地图两个GPS坐标之间距离的方法
Jan 09 PHP
PHP开发框架laravel安装与配置教程
Mar 13 PHP
php实现面包屑导航例子分享
Dec 19 PHP
php封装的验证码工具类完整实例
Oct 19 PHP
php正则判断是否为合法身份证号的方法
Mar 16 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
Apr 19 PHP
使用PHP开发留言板功能
Nov 19 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
Apr 14 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/03/16 PHP
用javascript实现计算两个日期的间隔天数
2007/08/14 Javascript
Jquery插件写法笔记整理
2012/09/06 Javascript
利用js 进行输入框自动匹配字符的小例子
2013/06/29 Javascript
jquery跟js初始化加载的多种方法及区别介绍
2014/04/02 Javascript
使用jquery animate创建平滑滚动效果(可以是到顶部、到底部或指定地方)
2014/05/27 Javascript
JavaScript实现重置表单(reset)的方法
2015/04/02 Javascript
基于jQuery实现的美观星级评论打分组件代码
2015/10/30 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
原生JS上传大文件显示进度条 php上传文件代码
2020/03/27 Javascript
vue组件详解之使用slot分发内容
2018/04/09 Javascript
Vue 中使用 CSS Modules优雅方法
2018/04/09 Javascript
JS实现监控微信小程序的原理
2018/06/15 Javascript
Angular使用cli生成自定义文件、组件的方法
2018/09/04 Javascript
说说如何利用 Node.js 代理解决跨域问题
2019/04/22 Javascript
react 原生实现头像滚动播放的示例
2020/04/21 Javascript
js实现简易点击切换显示或隐藏
2020/11/29 Javascript
[01:00:04]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第二局
2016/02/26 DOTA
[03:59]5分钟带你了解什么是DOTA2(第二期)
2017/02/07 DOTA
Python isinstance判断对象类型
2008/09/06 Python
使用Python的Scrapy框架编写web爬虫的简单示例
2015/04/17 Python
利用Python破解验证码实例详解
2016/12/08 Python
Python变量赋值的秘密分享
2018/04/03 Python
python编写暴力破解zip文档程序的实例讲解
2018/04/24 Python
python2与python3共存问题的解决方法
2018/09/18 Python
手把手教你如何安装Pycharm(详细图文教程)
2018/11/28 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
cosme官方海外旗舰店:日本最大化妆品和美容产品的综合口碑网站
2017/01/18 全球购物
家庭睡衣和家庭用品:Little Blue House
2018/03/18 全球购物
毕业生求职推荐信
2013/11/04 职场文书
经贸韩语专业大学生职业规划
2014/02/14 职场文书
信息科学与技术专业求职信范文
2014/02/20 职场文书
党支部先进事迹材料
2014/12/24 职场文书
劳动模范获奖感言
2015/07/31 职场文书
一定要知道的 25 个 Vue 技巧
2021/11/02 Vue.js
python读取并查看npz/npy文件数据以及数据显示方法
2022/04/14 Python