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 相关文章推荐
使用sockets:从新闻组中获取文章(一)
Oct 09 PHP
php 归并排序 数组交集
May 10 PHP
PHP Switch 语句之学习笔记
Sep 21 PHP
PHP 使用redis简单示例分享
Mar 05 PHP
详解WordPress中过滤链接与过滤SQL语句的方法
Dec 18 PHP
php使用glob函数遍历文件和目录详解
Sep 23 PHP
PHP获取用户客户端真实IP的解决方案
Oct 10 PHP
Yii框架中jquery表单验证插件用法示例
Oct 18 PHP
PHP下的浮点运算不准的解决方法
Oct 27 PHP
php微信公众号开发模式详解
Nov 28 PHP
php实现姓名根据首字母排序的类与方法(实例代码)
May 16 PHP
Laravel多域名下字段验证的方法
Apr 04 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操作数组相关函数
2011/02/03 PHP
PHP实现单例模式最安全的做法
2014/06/13 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十)
2014/06/24 PHP
thinkphp5引入公共部分header、footer的方法详解
2018/09/14 PHP
javascript json2 使用方法
2010/03/16 Javascript
javascript学习基础笔记之DOM对象操作
2011/11/03 Javascript
jQuery.validate 常用方法及需要注意的问题
2013/03/20 Javascript
解析JavaScript实现DDoS攻击原理与保护措施
2016/12/26 Javascript
vue axios 二次封装的示例代码
2017/12/08 Javascript
vue实现图片上传功能
2020/05/28 Javascript
使用AutoJs实现微信抢红包的代码
2020/12/31 Javascript
[01:14:31]Secret vs VG 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
[03:48]大碗DOTA
2019/07/25 DOTA
[50:54]完美世界DOTA2联赛 GXR vs IO 第三场 11.07
2020/11/10 DOTA
[01:35:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第一场 1月18日
2021/03/11 DOTA
Python爬取读者并制作成PDF
2015/03/10 Python
Python使用Flask框架同时上传多个文件的方法
2015/03/21 Python
Python通过正则表达式选取callback的方法
2015/07/18 Python
Python中文件I/O高效操作处理的技巧分享
2017/02/04 Python
Python正则表达式完全指南
2017/05/25 Python
python3在同一行内输入n个数并用列表保存的例子
2019/07/20 Python
python3图片文件批量重命名处理
2019/10/31 Python
Python如何实现在字符串里嵌入双引号或者单引号
2020/03/02 Python
借助Paramiko通过Python实现linux远程登陆及sftp的操作
2020/03/16 Python
Keras中 ImageDataGenerator函数的参数用法
2020/07/03 Python
使用python求斐波那契数列中第n个数的值示例代码
2020/07/26 Python
Python进行统计建模
2020/08/10 Python
使用css3制作登录表单的步骤
2014/04/07 HTML / CSS
详解html5 shiv.js和respond.min.js
2018/01/24 HTML / CSS
宝拉珍选英国官网:Paula’s Choice英国
2019/05/29 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?用contains来区分是否有重复的对象。还是都不用
2013/07/30 面试题
市场开发与营销专业求职信范文
2014/05/01 职场文书
机械设备与数控技术专业求职信
2014/08/10 职场文书
党员个人整改方案及措施
2014/10/25 职场文书
html2 canvas svg不能识别的解决方案
2021/06/03 HTML / CSS
【海涛解说】pis亲自推荐,其实你从来不会玩NW
2022/04/01 DOTA