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 相关文章推荐
解决文件名解压后乱码的问题 将文件名进行转码的代码
Jan 10 PHP
php使用curl发送json格式数据实例
Dec 17 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
Nov 25 PHP
PHP回溯法解决0-1背包问题实例分析
Mar 23 PHP
php判断一个数组是否为有序的方法
Mar 27 PHP
PHP扩展开发教程(总结)
Nov 04 PHP
php封装的连接Mysql类及用法分析
Dec 10 PHP
WordPress中制作导航菜单的PHP核心方法讲解
Dec 11 PHP
PHP实现的简单分页类及用法示例
May 06 PHP
Yii2中SqlDataProvider用法示例
Sep 22 PHP
php基于环形链表解决约瑟夫环问题示例
Nov 07 PHP
PHP使用HTML5 FormData对象提交表单操作示例
Jul 02 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&amp;&amp;mysql)二
2006/10/09 PHP
PHP中uploaded_files函数使用方法详解
2011/03/09 PHP
php 获取SWF动画截图示例代码
2014/02/10 PHP
php通过array_merge()函数合并关联和非关联数组的方法
2015/03/18 PHP
php实现TCP端口检测的方法
2015/04/01 PHP
小程序微信退款功能实现方法详解【基于thinkPHP】
2019/05/05 PHP
laravel Model 执行事务的实现
2019/10/10 PHP
斜45度寻路实现函数
2009/08/20 Javascript
理解JSON:3分钟课程
2011/10/28 Javascript
jquery实现倒计时代码分享
2014/06/13 Javascript
jQuery取消特定的click事件
2016/02/29 Javascript
javascript中闭包概念与用法深入理解
2016/12/15 Javascript
Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表)
2017/05/30 Javascript
bootstrap switch开关组件使用方法详解
2017/08/22 Javascript
实现elementUI表单的全局验证的方法步骤
2019/04/29 Javascript
微信公众号平台接口开发 菜单管理的实现
2019/08/14 Javascript
javascript设计模式 ? 桥接模式原理与应用实例分析
2020/04/13 Javascript
编写一个javascript元循环求值器的方法
2020/04/14 Javascript
解决vue项目本地启动时无法携带cookie的问题
2021/02/06 Vue.js
简单说明Python中的装饰器的用法
2015/04/24 Python
Python环境下搭建属于自己的pip源的教程
2016/05/05 Python
Python元组 tuple的概念与基本操作详解【定义、创建、访问、计数、推导式等】
2019/10/30 Python
Python中断多重循环的几种方式详解
2020/02/10 Python
解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题
2020/07/02 Python
详解Python 最短匹配模式
2020/07/29 Python
乐天旅游香港网站:日本饭店预订
2017/11/29 全球购物
俄罗斯运动鞋商店:Sneakerhead
2018/05/10 全球购物
澳大利亚手袋、珠宝和在线时尚精品店:The Way
2019/12/21 全球购物
Araks官网:纽约内衣品牌
2020/10/15 全球购物
《囚绿记》教学反思
2014/03/01 职场文书
取保候审保证书
2014/04/30 职场文书
2014年结对帮扶工作总结
2014/12/17 职场文书
治理商业贿赂工作总结
2015/08/10 职场文书
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
2021/06/08 Python
OpenCV-Python 实现两张图片自动拼接成全景图
2021/06/11 Python
vue实现简易音乐播放器
2022/08/14 Vue.js