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 相关文章推荐
为php4加入动态flash文件的生成的支持
Oct 09 PHP
php+AJAX传送中文会导致乱码的问题的解决方法
Sep 08 PHP
php数据库抽象层 PDO
May 07 PHP
用PHP和Shell写Hadoop的MapReduce程序
Apr 15 PHP
php实现获取文章内容第一张图片的方法
Nov 04 PHP
一个完整的php文件上传类实例讲解
Oct 27 PHP
PHP树-不需要递归的实现方法
Jun 21 PHP
php PDO判断连接是否可用的实现方法
Apr 03 PHP
PHP基于关联数组20行代码搞定约瑟夫问题示例
Nov 07 PHP
PHP PDOStatement::bindValue讲解
Jan 30 PHP
Laravel向公共模板赋值方法总结
Jun 25 PHP
php实现文件上传基本验证
Mar 04 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/05/04 PHP
用PHP实现浏览器点击下载TXT文档的方法详解
2013/06/02 PHP
ThinkPHP的MVC开发机制实例解析
2014/08/23 PHP
使用新的消息弹出框blackbirdjs
2008/10/16 Javascript
js trim函数 去空格函数与正则集锦
2009/11/20 Javascript
我遇到的参数传递中 双引号单引号嵌套问题
2010/02/11 Javascript
jQuery仿Excel表格编辑功能的实现代码
2013/05/01 Javascript
jquery序列化方法实例分析
2015/06/10 Javascript
js正则表达式验证邮件地址
2015/11/12 Javascript
js 作用域和变量详解
2017/02/16 Javascript
vue2.0实现前端星星评分功能组件实例代码
2018/02/12 Javascript
微信小程序踩坑记录之解决tabBar.list[3].selectedIconPath大小超过40kb
2018/07/04 Javascript
js纯前端实现腾讯cos文件上传功能的示例代码
2019/05/14 Javascript
Vue2.x通用编辑组件的封装及应用详解
2019/05/28 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
微信小程序清空输入框信息与实现屏幕往上滚动的示例代码
2020/06/23 Javascript
node koa2 ssr项目搭建的方法步骤
2020/12/11 Javascript
jQuery实现手风琴特效
2021/01/11 jQuery
Python中比较特别的除法运算和幂运算介绍
2015/04/05 Python
Python实现统计文本文件字数的方法
2017/05/05 Python
python中reduce()函数的使用方法示例
2017/09/29 Python
儿童编程python入门
2018/05/08 Python
Python闭包执行时值的传递方式实例分析
2018/06/04 Python
如何使用python操作vmware
2019/07/27 Python
浅谈django2.0 ForeignKey参数的变化
2019/08/06 Python
python__new__内置静态方法使用解析
2020/01/07 Python
python录音并调用百度语音识别接口的示例
2020/12/01 Python
WebSphere 应用服务器都支持哪些认证
2013/12/26 面试题
QA工程师岗位职责
2013/11/20 职场文书
预备党员思想汇报
2014/01/08 职场文书
小学教师寄语大全
2014/04/03 职场文书
《翻越远方的大山》教学反思
2014/04/13 职场文书
鼓舞士气的口号
2014/06/16 职场文书
六年级语文教学反思
2016/03/03 职场文书
同学联谊会邀请函
2019/06/24 职场文书
Java Optional<Foo>转换成List<Bar>的实例方法
2021/06/20 Java/Android