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的autoload自动加载机制使用说明
Dec 28 PHP
深入php之规范编程命名小结
May 15 PHP
php之XML转数组函数的详解
Jun 07 PHP
php获取操作系统语言代码
Nov 04 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
Jun 26 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
Apr 21 PHP
PHP实现的文件操作类及文件下载功能示例
Dec 24 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
Sep 16 PHP
thinkPHP5框架导出Excel文件简单操作示例
Aug 03 PHP
PHP7中I/O模型内核剖析详解
Apr 14 PHP
php使用socket调用http和smtp协议实例小结
Jul 26 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 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个人网站架设连环讲(一)
2006/10/09 PHP
Yii2实现多域名跨域同步登录退出
2017/02/04 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
js Array对象的扩展函数代码
2013/04/24 Javascript
JavaScript 变量、作用域及内存
2015/04/08 Javascript
浅谈javascript中for in 和 for each in的区别
2015/04/23 Javascript
Javascript实现鼠标右键特色菜单
2015/08/04 Javascript
详解JavaScript的另类写法
2016/04/11 Javascript
jQuery获取浏览器类型和版本号的方法
2016/07/05 Javascript
原生JS实现-星级评分系统的简单实例
2016/08/21 Javascript
Seajs是什么及sea.js 由来,特点以及优势
2016/10/13 Javascript
Bootstrap Modal遮罩弹出层(完整版)
2016/11/21 Javascript
基于nodejs 的多页面爬虫实例代码
2017/05/31 NodeJs
基于Taro的微信小程序模板消息-获取formId功能模块封装实践
2019/07/15 Javascript
详解nvm管理多版本node踩坑
2019/07/26 Javascript
layui下拉列表select实现可输入查找的方法
2019/09/28 Javascript
JavaScript实现单图片上传并预览功能
2019/09/30 Javascript
vue使用nprogress加载路由进度条的方法
2020/06/04 Javascript
vue渲染方式render和template的区别
2020/06/05 Javascript
Python中装饰器的一个妙用
2015/02/08 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
python绘制多个子图的实例
2019/07/07 Python
python pycharm的安装及其使用
2019/10/11 Python
django下创建多个app并设置urls方法
2020/08/02 Python
Pandas替换及部分替换(replace)实现流程详解
2020/10/12 Python
python实现学生信息管理系统(精简版)
2020/11/27 Python
Pycharm Plugins加载失败问题解决方案
2020/11/28 Python
校庆标语集锦
2014/06/25 职场文书
六查六看剖析材料
2014/10/06 职场文书
工作检讨书范文
2015/01/23 职场文书
小学三八妇女节活动总结
2015/02/06 职场文书
2015年母亲节寄语
2015/03/23 职场文书
2015年中秋寄语
2015/07/31 职场文书
Pytorch 统计模型参数量的操作 param.numel()
2021/05/13 Python
梳理总结Python开发中需要摒弃的18个坏习惯
2022/01/22 Python
springboot读取resources下文件的方式详解
2022/06/21 Java/Android