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实现链结人气统计
Oct 09 PHP
php读取大文件示例分享(文件操作类)
Apr 13 PHP
PHP使用range协议实现输出文件断点续传代码实例
Jul 04 PHP
PHP rsa加密解密使用方法
Apr 27 PHP
php中文验证码实现方法
Jun 18 PHP
php文件缓存方法总结
Mar 16 PHP
PHP实现登录搜狐广告获取广告联盟数据的方法【附demo源码】
Oct 14 PHP
php 微信开发获取用户信息如何实现
Dec 13 PHP
php 静态属性和静态方法区别详解
Apr 09 PHP
PHP Class SoapClient not found解决方法
Jan 20 PHP
PHP创建自己的Composer包方法
Apr 09 PHP
PHP htmlspecialchars_decode()函数用法讲解
Mar 01 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代码
2007/03/08 PHP
PHP加密解密类实例代码
2016/07/20 PHP
php实现的数组转xml案例分析
2019/09/28 PHP
php 输出缓冲 Output Control用法实例详解
2020/03/03 PHP
javascript Array对象基础知识小结
2010/11/16 Javascript
Jquery 一次处理多个ajax请求的代码
2011/09/02 Javascript
js修改table中Td的值(定义td的双击事件)
2013/01/10 Javascript
纯JavaScript实现HTML5 Canvas六种特效滤镜示例
2013/06/28 Javascript
jquery数组封装使用方法分享(jquery数组遍历)
2014/03/25 Javascript
Js 正则表达式知识汇总
2014/12/02 Javascript
JS实现网页表格自动变大缩小的方法
2015/03/09 Javascript
基于jquery实现页面滚动到底自动加载数据的功能
2015/12/19 Javascript
location.hash保存页面状态的技巧
2016/04/28 Javascript
jquery ajax结合thinkphp的getjson实现跨域的方法
2016/06/06 Javascript
微信小程序-详解数据缓存
2016/11/24 Javascript
jQuery实现的简单悬浮层功能完整实例
2017/01/23 Javascript
简单实现jQuery弹窗效果
2017/10/30 jQuery
微信小程序实现换肤功能
2018/03/14 Javascript
vue项目中axios请求网络接口封装的示例代码
2018/12/18 Javascript
layui 解决form表单点击无反应的问题
2019/10/25 Javascript
python单例模式实例分析
2015/04/08 Python
Python基于递归算法实现的走迷宫问题
2017/08/04 Python
python版百度语音识别功能
2019/07/09 Python
pytorch中nn.Conv1d的用法详解
2019/12/31 Python
Python PyInstaller安装和使用教程详解
2020/01/08 Python
利用Python实现某OA系统的自动定位功能
2020/05/27 Python
大堂副理的岗位职责范文
2014/02/17 职场文书
实习评语大全
2014/04/26 职场文书
四查四看自我剖析材料
2014/09/19 职场文书
设备技术员岗位职责
2015/04/11 职场文书
项目战略合作意向书
2015/05/08 职场文书
爱国影片观后感
2015/06/18 职场文书
爱鸟护鸟的宣传语
2015/07/13 职场文书
小学语文教学随笔
2015/08/14 职场文书
Go语言 go程释放操作(退出/销毁)
2021/04/30 Golang
分析SQL窗口函数之排名窗口函数
2022/04/21 Oracle