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 和 XML: 使用expat函数(一)
Oct 09 PHP
收集的DedeCMS一些使用经验
Mar 17 PHP
PHP正则的Unknown Modifier错误解决方法
Mar 02 PHP
PHP查询MySQL大量数据的时候内存占用分析
Jul 22 PHP
php自动给文章加关键词链接的函数代码
Nov 29 PHP
php检测用户是否用手机(Mobile)访问网站的类
Jan 09 PHP
php 判断字符串中是否包含html标签
Feb 17 PHP
Windows和Linux中php代码调试工具Xdebug的安装与配置详解
May 08 PHP
PHP获取windows登录用户名的方法
Jun 24 PHP
PHP之uniqid()函数用法
Nov 03 PHP
Laravel 解决composer相关操作提示php相关异常的问题
Oct 23 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
Dec 18 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
《心理测量者3》剧场版动画预告
2020/03/02 日漫
PHP+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
深入理解PHP中的empty和isset函数
2016/05/26 PHP
使javascript也能包含文件
2006/10/26 Javascript
url 特殊字符 传递参数解决方法
2010/01/01 Javascript
JS中自定义定时器让它在某一时刻执行
2014/09/02 Javascript
超棒的响应式布局jQuery插件Freetile.js
2014/11/17 Javascript
jQuery匹配文档链接并添加class的方法
2015/06/26 Javascript
javascript中类的定义方式详解(四种方式)
2015/12/22 Javascript
Three.js学习之正交投影照相机
2016/08/01 Javascript
Js动态设置rem来实现移动端字体的自适应代码
2016/10/14 Javascript
Bootstrap select多选下拉框实现代码
2016/12/23 Javascript
bootstrap中添加额外的图标实例代码
2017/02/15 Javascript
基于Nodejs利用socket.io实现多人聊天室
2017/02/22 NodeJs
超简单的Vue.js环境搭建教程
2017/03/17 Javascript
vue之将echart封装为组件
2018/06/02 Javascript
Antd-vue Table组件添加Click事件,实现点击某行数据教程
2020/11/17 Javascript
Python程序设计入门(5)类的使用简介
2014/06/16 Python
利用Python命令行传递实例化对象的方法
2016/11/02 Python
浅谈python import引入不同路径下的模块
2017/07/11 Python
python3 cvs将数据读取为字典的方法
2018/12/22 Python
关于Python作用域自学总结
2019/06/10 Python
python matplotlib如何给图中的点加标签
2019/11/14 Python
python爬虫把url链接编码成gbk2312格式过程解析
2020/06/08 Python
Python devel安装失败问题解决方案
2020/06/09 Python
简述python&amp;pytorch 随机种子的实现
2020/10/07 Python
CSS3教程(4):网页边框和网页文字阴影
2009/04/02 HTML / CSS
html5指南-7.geolocation结合google maps开发一个小的应用
2013/01/07 HTML / CSS
Shopee印度尼西亚:东南亚与台湾市场最大电商平台
2018/06/17 全球购物
英国玛莎百货澳大利亚:Marks & Spencer Australia
2019/08/30 全球购物
ruby如何进行集成操作?Ruby能进行多重继承吗?
2013/10/16 面试题
土木工程应届生求职信
2013/10/31 职场文书
2014年两会学习心得体会
2014/03/10 职场文书
安全生产管理责任书
2014/04/16 职场文书
企业培训简报范文
2015/07/20 职场文书
小学入学感言
2015/08/01 职场文书