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 相关文章推荐
人尽可用的Windows技巧小贴士之下篇
Mar 22 PHP
php 采集书并合成txt格式的实现代码
Mar 01 PHP
php检测图片木马多进制编程实践
Apr 11 PHP
php 生成自动创建文件夹并上传文件的示例代码
Mar 07 PHP
PHP下通过QRCode类库创建中间带网站LOGO的二维码
Jul 12 PHP
smarty内置函数config_load用法实例
Jan 22 PHP
php自定义分页类完整实例
Dec 25 PHP
PHP基本语法实例总结
Sep 09 PHP
PHP仿微信多图片预览上传实例代码
Sep 13 PHP
记录一次排查PHP脚本执行卡住的问题
Dec 27 PHP
php获取字符串前几位的实例(substr返回字符串的子串用法)
Mar 08 PHP
php文件包含的几种方式总结
Sep 19 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显示指定目录下子目录的方法
2015/03/20 PHP
遍历echsop的region表形成缓存的程序实例代码
2016/11/01 PHP
PHP+AjaxForm异步带进度条上传文件实例代码
2017/08/14 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
PHP attributes()函数讲解
2019/02/03 PHP
学习YUI.Ext基础第一天
2007/03/10 Javascript
Span元素的width属性无效果原因及解决方案
2010/01/15 Javascript
JavaScript 高级篇之闭包、模拟类,继承(五)
2012/04/07 Javascript
Nodejs Post请求报socket hang up错误的解决办法
2014/09/25 NodeJs
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
2015/05/25 Javascript
js实现仿qq消息的弹出窗效果
2016/01/06 Javascript
如何实现星星评价(jquery.raty.js插件)
2016/12/21 Javascript
Vue.js递归组件构建树形菜单
2017/12/24 Javascript
Angular模版驱动表单的使用总结
2018/05/05 Javascript
vue中$set的使用(结合在实际应用中遇到的坑)
2018/07/10 Javascript
angularjs http与后台交互的实现示例
2018/12/21 Javascript
记录一次开发微信网页分享的步骤
2019/05/07 Javascript
JS实现继承的几种常用方式示例
2019/06/22 Javascript
vue实现鼠标经过动画
2019/10/16 Javascript
微信小程序实现横向滚动导航栏效果
2019/12/12 Javascript
Python内置的字符串处理函数整理
2013/01/29 Python
python使用PIL模块实现给图片打水印的方法
2015/05/22 Python
python如何统计序列中元素
2020/07/31 Python
Python使用分布式锁的代码演示示例
2018/07/30 Python
使用python批量修改文件名的方法(视频合并时)
2020/03/24 Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
2019/08/30 Python
深入了解Python在HDA中的应用
2019/09/05 Python
Jupyter Notebook 远程访问配置详解
2021/01/11 Python
Java工程师面试集锦之Spring框架
2013/06/16 面试题
给女朋友的道歉信
2014/01/10 职场文书
小区停车场管理制度
2014/01/27 职场文书
网络管理专业求职信
2014/03/15 职场文书
车间主任岗位职责
2015/02/03 职场文书
2016教师廉洁教育心得体会
2016/01/13 职场文书
学习型家庭事迹材料(2016精选版)
2016/02/29 职场文书
PostgreSQL存储过程实用脚本(二):创建函数入门
2021/04/05 PostgreSQL