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
为查询结果建立向后/向前按钮
Oct 09 PHP
PHP clearstatcache()函数详解
Mar 02 PHP
PHP大批量数据操作时临时调整内存与执行时间的方法
Apr 20 PHP
PHP数据集构建JSON格式及新数组的方法
Nov 07 PHP
PHP启动windows应用程序、执行bat批处理、执行cmd命令的方法(exec、system函数详解)
Oct 20 PHP
php中smarty区域循环的方法
Jun 11 PHP
浅析php静态方法与非静态方法的用法区别
May 17 PHP
基于thinkPHP实现的微信自定义分享功能示例
Sep 23 PHP
php利用array_search与array_column实现二维数组查找
Jul 08 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
Oct 18 PHP
php 使用expat方式解析xml文件操作示例
Nov 26 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冒泡排序算法代码详细解读
2011/07/17 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
2014/11/08 PHP
php常用字符串处理函数实例分析
2014/11/22 PHP
PHP扩展模块memcached长连接使用方法分析
2014/12/24 PHP
Node.js实现在目录中查找某个字符串及所在文件
2014/09/03 Javascript
jQuery表格插件datatables用法总结
2014/09/05 Javascript
使用jquery实现仿百度自动补全特效
2015/07/23 Javascript
javascript实现的登陆遮罩效果汇总
2015/11/09 Javascript
JS验证邮件地址格式方法小结
2015/12/01 Javascript
浅谈js的异步执行
2016/10/18 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
2016/11/07 Javascript
JavaScript对象封装的简单实现方法(3种方法)
2017/01/03 Javascript
微信小程序 下拉列表的实现实例代码
2017/03/08 Javascript
如何在vue里添加好看的lottie动画
2018/08/02 Javascript
vue2.0 路由模式mode=&quot;history&quot;的作用
2018/10/18 Javascript
在vue中使用express-mock搭建mock服务的方法
2018/11/07 Javascript
Angular CLI 使用教程指南参考小结
2019/04/10 Javascript
详解vue-cli3多页应用改造
2019/06/04 Javascript
JavaScript 中的执行上下文和执行栈实例讲解
2021/02/25 Javascript
[11:01]2014DOTA2西雅图邀请赛 冷冷带你探秘威斯汀
2014/07/08 DOTA
[02:55]含熏伴清风,风行者至宝、屠夫身心及典藏宝瓶二展示
2020/09/08 DOTA
[33:19]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第一场 11.26
2020/11/30 DOTA
python应用程序在windows下不出现cmd窗口的办法
2014/05/29 Python
Python中还原JavaScript的escape函数编码后字符串的方法
2014/08/22 Python
Python的组合模式与责任链模式编程示例
2016/02/02 Python
Python进程间通信之共享内存详解
2017/10/30 Python
Python实现PS图像抽象画风效果的方法
2018/01/23 Python
python中使用psutil查看内存占用的情况
2018/06/11 Python
土耳其时尚潮流在线购物网站:Trendyol
2017/10/10 全球购物
navabi英国:设计师大码女装
2019/06/25 全球购物
Python里面如何拷贝一个对象
2014/02/17 面试题
2014年公务员工作总结
2014/11/18 职场文书
2014年保险公司工作总结
2014/11/22 职场文书
大学生自荐书范文
2015/03/05 职场文书
深入浅析React中diff算法
2021/05/19 Javascript
MySQL命令无法输入中文问题的解决方式
2021/08/30 MySQL