PHP折半(二分)查找算法实例分析


Posted in PHP onMay 12, 2018

本文实例讲述了PHP折半(二分)查找算法。分享给大家供大家参考,具体如下:

折半查询只适用于已经按照正序或者逆序排序的数组,字符串等;

算法:

先取数组的中间位置,无中间位置,则向下取整;

从中间进行折半,大小判断,进入前半段或者后半段;

再对前半段或者后半段进行同样的折半查询,

直到查询到匹配的字符,才停止(本例用break,如果置于函数中,return即可)

php实现的代码如下:

<?php
$arr = array(1,2,3,4,5,6,7,8,9,10);//数组
$key = 4;//要查询的关键字
$low = 0;//开始位的标志
$high = count($arr);//终止位的标志
while($low <= $high){//查询开始结束的条件
 $mid = floor(($low + $high)/2);//进行中间位置计算,向下取整
 if($arr[$mid] == $key){//查询成功
 echo $arr[$mid];
 break;//结束本页执行,函数可用return
 }elseif($arr[$mid] > $key){ //查询前半段,把结束标志移到中间位置前一位
 $high = $mid - 1;
 }else{ //查询后半段,把开始位置移到中间位置的后一位
 $low = $mid + 1;
 }
}
/*
运行结果:4
*/
?>

补充:折半(二分)查找算法类:

/**
 * Description:php实现二分查找算法的类
 * @author wzy
 */
class binary_search{
  public $arr;
  public $key;
  function __construct($arr,$key){
    //这里初始化的数组已经是有序数组
    $this->arr=$arr;
    $this->key=$key;
  }
  function binarysearch(){
    $start=0;
    $end=count($this->arr)-1;
    while($start<=$end){
      //mid的取值可以为上整数或者下整数
      $mid=ceil(($start+$end)/2);
      //$mid=($start+$end)>>1;
      //$mid=intval(($start+$end)/2);
      if($this->arr[$mid]<$this->key){
        $start=$mid+1;
      }else if($this->arr[$mid]>$this->key){
        $end=$mid-1;
      }else{
        return $mid;
      }
    }
  }
}

可能大家还会遇到这种情况,数组中的元素有重复数据,需要返回的是重复数据中的第一个元素的位置,例如

$arr=array(1,2,3,4,5,6,6,6,6,7,8);

查找6这个元素时返回的位置应该为5,而不是其他(下标从0开始计数),这样需要在返回的mid进行判断,代码如下:

/**
 * Description:php实现二分查找算法的类
 * @author wzy
 */
class binary_search{
  public $arr;
  public $key;
  function __construct($arr,$key){
    //这里初始化的数组已经是有序数组
    $this->arr=$arr;
    $this->key=$key;
  }
  function binarysearch(){
    $start=0;
    $end=count($this->arr)-1;
    while($start<=$end){
      //mid的取值可以为上整数或者下整数
      $mid=ceil(($start+$end)/2);
      //$mid=($start+$end)>>1;
      //$mid=intval(($start+$end)/2);
      if($this->arr[$mid]<$this->key){
        $start=$mid+1;
      }else if($this->arr[$mid]>$this->key){
        $end=$mid-1;
      }else{
        //返回第一个匹配的元素
        for($i=$mid-1;$i>=0;$i--){
          if($this->arr[$i]==$this->key){
            $mid=$i;
          }else{
            break;
          }
        }
        return $mid;
      }
    }
  }
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP.MVC的模板标签系统(三)
Sep 05 PHP
php中常用编辑器推荐
Jan 02 PHP
php split汉字
Jun 05 PHP
php自动加载的两种实现方法
Jun 21 PHP
discuz的php防止sql注入函数
Jan 17 PHP
php中json_decode()和json_encode()的使用方法
Jun 04 PHP
php实现简单洗牌算法
Jun 18 PHP
PHP中Header使用的HTTP协议及常用方法小结
Nov 04 PHP
php常见的魔术方法详解
Dec 25 PHP
PHP中的密码加密的解决方案总结
Oct 26 PHP
php中10个不同等级压缩优化图片操作示例
Nov 14 PHP
php提高脚本性能的4个技巧
Aug 18 PHP
PHP区块查询实现方法分析
May 12 #PHP
可兼容php5与php7的cURL文件上传功能实例分析
May 11 #PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
May 11 #PHP
PHP7基于curl实现的上传图片功能
May 11 #PHP
关于ThinkPHP中的异常处理详解
May 11 #PHP
PHP基于递归算法解决兔子生兔子问题
May 11 #PHP
PHP7如何开启Opcode打造强悍性能详解
May 11 #PHP
You might like
php使用fputcsv()函数csv文件读写数据的方法
2015/01/06 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
浅谈Laravel核心解读之Console内核
2018/12/02 PHP
JQuery 弹出框定位实现方法
2010/12/02 Javascript
推荐11款jQuery开发的复选框和单选框美化插件
2011/08/02 Javascript
JS继承--原型链继承和类式继承
2013/04/08 Javascript
解析Jquery取得iframe中元素的几种方法
2013/07/04 Javascript
js日期相关函数总结分享
2013/10/15 Javascript
js和jquery如何获取图片真实的宽度和高度
2014/09/28 Javascript
javascript实现单击和双击并存的方法
2014/12/13 Javascript
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
2015/04/22 Javascript
AngularJS转换响应内容
2016/01/27 Javascript
JavaScript弹窗基础篇
2016/04/27 Javascript
jQuery on()方法绑定动态元素的点击事件实例代码浅析
2016/06/16 Javascript
实例详解jQuery的无new构建
2016/08/02 Javascript
jquery+ajax实现省市区三级联动 (封装和不封装两种方式)
2017/05/15 jQuery
layui问题之模拟select点击事件的实例讲解
2018/08/15 Javascript
微信小程序视图控件与bindtap之间的问题的解决
2019/04/08 Javascript
详解基于Vue的支持数据双向绑定的select组件
2019/09/02 Javascript
使用Vue调取接口,并渲染数据的示例代码
2019/10/28 Javascript
[01:01:52]完美世界DOTA2联赛PWL S2 GXR vs Magma 第二场 11.25
2020/11/26 DOTA
用Python输出一个杨辉三角的例子
2014/06/13 Python
Python中取整的几种方法小结
2017/01/06 Python
python实现ip地址的包含关系判断
2020/02/07 Python
pytorch masked_fill报错的解决
2020/02/18 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
2020/03/04 Python
Python之Sklearn使用入门教程
2021/02/19 Python
一套PHP的笔试题
2013/05/31 面试题
护理专业毕业生推荐信
2013/10/31 职场文书
护士自荐信范文
2013/12/15 职场文书
公司节能减排方案
2014/05/16 职场文书
团队精神口号
2014/06/06 职场文书
学校领导班子成员查摆问题及整改措施
2014/10/28 职场文书
Java并发编程之Executor接口的使用
2021/06/21 Java/Android
MySQL创建表操作命令分享
2022/03/25 MySQL
Java版 单机五子棋
2022/05/04 Java/Android