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中养成7个面向对象的好习惯
Jan 28 PHP
一道关于php变量引用的面试题
Aug 08 PHP
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
Mar 19 PHP
php中对2个数组相加的函数
Jun 24 PHP
用PHP实现 上一篇、下一篇的代码
Sep 29 PHP
php内存缓存实现方法
Jan 24 PHP
WordPress过滤垃圾评论的几种主要方法小结
Jul 11 PHP
ThinkPHP实现分页功能
Apr 28 PHP
PHP获取redis里不存在的6位随机数应用示例【设置24小时过时】
Jun 07 PHP
利用laravel搭建一个迷你博客实战教程
Aug 13 PHP
Laravel核心解读之异常处理的实践过程
Feb 24 PHP
php实现的数组转xml案例分析
Sep 28 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文件时顶部出现空白影响布局分析原因及解决办法
2013/01/11 PHP
PHP语法自动检查的Vim插件
2014/08/11 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
2016/04/30 PHP
表单元素事件 (Form Element Events)
2009/07/17 Javascript
JavaScript 直接操作本地文件的实现代码
2009/12/01 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
2010/12/30 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
JS简单计算器实例
2015/01/20 Javascript
jquery SweetAlert插件实现响应式提示框
2015/08/18 Javascript
JavaScript高级教程5.6之基本包装类型(详细)
2015/11/23 Javascript
使用JSON作为函数的参数的优缺点
2016/10/27 Javascript
js中的面向对象入门
2017/03/06 Javascript
JS实现图片转换成base64的各种应用场景实例分析
2018/06/22 Javascript
在微信小程序中保存网络图片
2019/02/12 Javascript
jQuery操作事件完整实例分析
2020/01/10 jQuery
gearman的安装启动及python API使用实例
2014/07/08 Python
Python中join函数简单代码示例
2018/01/09 Python
Python简单实现的代理服务器端口映射功能示例
2018/04/08 Python
Django 多语言教程的实现(i18n)
2018/07/07 Python
Python使用import导入本地脚本及导入模块的技巧总结
2019/08/07 Python
python标准库sys和OS的函数使用方法与实例详解
2020/02/12 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
2020/04/10 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
Python使用jupyter notebook查看ipynb文件过程解析
2020/06/02 Python
keras得到每层的系数方式
2020/06/15 Python
15个Pythonic的代码示例(值得收藏)
2020/10/29 Python
python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)
2020/12/10 Python
Amcal中文官网:澳洲综合性连锁药房
2019/03/28 全球购物
护理专业个人求职简历的自我评价
2013/10/13 职场文书
多媒体编辑专业毕业生推荐信
2013/11/05 职场文书
预防传染病方案
2014/06/14 职场文书
2014年班务工作总结
2014/12/02 职场文书
员工辞职信范文
2015/03/02 职场文书
2015年感恩母亲节的演讲稿
2015/03/18 职场文书
困难补助申请报告
2015/05/19 职场文书
2016暑期政治学习心得体会
2016/01/23 职场文书