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 JSON格式数据交互实例代码详解
Jan 13 PHP
使用PHP获取汉字的拼音(全部与首字母)
Jun 27 PHP
PHP static局部静态变量和全局静态变量总结
Mar 02 PHP
yii操作session实例简介
Jul 31 PHP
ThinkPHP中的三大自动简介
Aug 22 PHP
php rsa加密解密使用详解
Jan 14 PHP
浅谈php中urlencode与rawurlencode的区别
Sep 05 PHP
浅谈PHP中try{}catch{}的使用方法
Dec 09 PHP
php str_getcsv把字符串解析为数组的实现方法
Apr 05 PHP
php检查函数必传参数是否存在的实例详解
Aug 28 PHP
PHP Ajax跨域问题解决方案代码实例
Aug 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
网页自动跳转代码收集
2009/09/27 Javascript
数组方法解决JS字符串连接性能问题有争议
2011/01/12 Javascript
js 如何实现对数据库的增删改查
2012/11/23 Javascript
wap手机图片滑动切换特效无css3元素js脚本编写
2014/07/28 Javascript
javascript动态添加checkbox复选框的方法
2015/12/23 Javascript
BootStrap Fileinput的使用教程
2016/12/30 Javascript
javascript 正则表达式去空行方法
2017/01/24 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
2017/05/17 Javascript
纯js实现动态时间显示
2020/09/07 Javascript
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
2017/07/05 NodeJs
JavaScript数组去重的多种方法(四种)
2017/09/19 Javascript
解决Jquery下拉框数据动态获取的问题
2018/01/25 jQuery
Vue项目pdf(base64)转图片遇到的问题及解决方法
2018/10/19 Javascript
vue实现抖音时间转盘
2019/09/08 Javascript
微信小程序单选框自定义赋值
2020/05/26 Javascript
多个Vue项目部署到服务器的步骤记录
2020/10/22 Javascript
flask中使用SQLAlchemy进行辅助开发的代码
2013/02/10 Python
Python深入学习之闭包
2014/08/31 Python
python中requests使用代理proxies方法介绍
2017/10/25 Python
redis之django-redis的简单缓存使用
2018/06/07 Python
numpy.linspace 生成等差数组的方法
2018/07/02 Python
运用PyTorch动手搭建一个共享单车预测器
2019/08/06 Python
python集合能干吗
2020/07/19 Python
浅谈如何使用python抓取网页中的动态数据实现
2020/08/17 Python
Adobe Html5 Extension开发初体验图文教程
2017/11/14 HTML / CSS
美国Max仓库:Max Warehouse
2020/05/31 全球购物
介绍一下内联、左联、右联
2013/12/31 面试题
高中生毕业学习总结的自我评价
2013/11/14 职场文书
护理毕业生自我鉴定
2014/02/11 职场文书
感恩母亲节演讲稿
2014/05/07 职场文书
小学优秀教育工作者事迹材料
2014/05/09 职场文书
党支部三会一课计划
2014/09/24 职场文书
大一学生个人总结
2015/02/15 职场文书
优秀班干部主要事迹材料
2015/11/04 职场文书
go语言map与string的相互转换的实现
2021/04/07 Golang
JS轻量级函数式编程实现XDM三
2022/06/16 Javascript