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极大的增强功能和性能
Oct 09 PHP
PHP_MySQL教程-第一天
Mar 18 PHP
php文件上传表单摘自drupal的代码
Feb 15 PHP
浅析51个PHP处理字符串的函数
Aug 02 PHP
php使用sql数据库 获取字段问题介绍
Aug 12 PHP
浅谈php7的重大新特性
Oct 23 PHP
浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
Oct 26 PHP
php简单截取字符串代码示例
Oct 19 PHP
PHP数组操作实例分析【添加,删除,计算,反转,排序,查找等】
Dec 24 PHP
PHP搭建大文件切割分块上传功能示例
Jan 04 PHP
php 7新特性之类型申明详解
Jun 06 PHP
php使用scandir()函数扫描指定目录下所有文件示例
Jun 08 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
第十四节--命名空间
2006/11/16 PHP
理解和运用PHP中的多态性[译]
2011/08/02 PHP
php中的boolean(布尔)类型详解
2013/10/28 PHP
php防止sql注入代码实例
2013/12/18 PHP
神盾加密解密教程(二)PHP 神盾解密
2014/06/08 PHP
ThinkPHP中Widget扩展的两种写法及调用方法详解
2017/05/04 PHP
PHP实现找出有序数组中绝对值最小的数算法分析
2017/08/07 PHP
Nigma vs AM BO3 第一场2.13
2021/03/10 DOTA
Javascript - HTML的request类
2006/07/15 Javascript
JQuery 简便实现页面元素数据验证功能
2007/03/24 Javascript
Javascript 日期处理之时区问题
2009/10/08 Javascript
简述AngularJS的控制器的使用
2015/06/16 Javascript
jQuery无刷新上传之uploadify3.1简单使用
2016/06/18 Javascript
纯css下拉菜单 无需js
2016/08/15 Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
2017/03/01 Javascript
JavaScript通过filereader接口读取文件
2017/05/10 Javascript
基于Bootstrap框架菜鸟入门教程(推荐)
2017/09/17 Javascript
jQuery获取所有父级元素及同级元素及子元素的方法(推荐)
2018/01/21 jQuery
JS实现的简单下拉框联动功能示例
2018/05/11 Javascript
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
详谈Vue.js框架下main.js,App.vue,page/index.vue之间的区别
2020/08/12 Javascript
[42:24]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第一场 11.01
2020/11/02 DOTA
基于Python实现通过微信搜索功能查看谁把你删除了
2016/01/27 Python
Django实现快速分页的方法实例
2017/10/22 Python
Python+树莓派+YOLO打造一款人工智能照相机
2018/01/02 Python
详解利用canvas实现环形进度条的方法
2019/06/12 HTML / CSS
AmazeUI 加载进度条的实现示例
2020/08/20 HTML / CSS
洲际酒店集团大中华区:IHG中国
2016/08/17 全球购物
企业文化建设实施方案
2014/03/22 职场文书
党员群众路线自我剖析材料
2014/10/06 职场文书
庆祝国庆节标语
2014/10/09 职场文书
2019年最新感恩节祝福语(28句)
2019/11/27 职场文书
Pandas 稀疏数据结构的实现
2021/07/25 Python
船舶调度指挥系统——助力智慧海事
2022/02/18 无线电
SpringBoot中HttpSessionListener的简单使用方式
2022/03/17 Java/Android
Python利用zhdate模块实现农历日期处理
2022/03/31 Python