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模拟SQL Server的两个日期处理函数
Oct 09 PHP
用PHP和ACCESS写聊天室(十)
Oct 09 PHP
php下通过伪造http头破解防盗链的代码
Jul 03 PHP
apache+codeigniter 通过.htcaccess做动态二级域名解析
Jul 01 PHP
PHP编码转换函数 自动转换字符集支持数组转换
Dec 16 PHP
PHP中spl_autoload_register函数的用法总结
Nov 07 PHP
简单谈谈php中ob_flush和flush的区别
Nov 27 PHP
typecho插件编写教程(四):插件挂载
May 28 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
Aug 31 PHP
PHP常用工具类大全附全部代码下载
Dec 07 PHP
CI框架中类的自动加载问题分析
Nov 21 PHP
PHP单例模式与工厂模式详解
Aug 29 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中break及continue两个流程控制指令区别分析
2011/04/18 PHP
php站内搜索并高亮显示关键字的实现代码
2011/12/29 PHP
详解PHP中strlen和mb_strlen函数的区别
2014/03/07 PHP
Yii2 输出xml格式数据的方法
2016/05/03 PHP
PHP 无限级分类
2017/05/04 PHP
PHP获取MySQL执行sql语句的查询时间方法
2018/08/21 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
2018/11/22 PHP
PHP字符串和十六进制如何实现互相转换
2020/07/16 PHP
JavaScript国旗变换效果代码
2008/08/13 Javascript
setTimeout与setInterval在不同浏览器下的差异
2010/01/24 Javascript
JS删除数组元素的函数介绍
2013/03/27 Javascript
提示$ is not defined错误分析及解决
2013/04/09 Javascript
在每个匹配元素的外部插入新元素的方法
2013/12/20 Javascript
Jquery日历插件制作简单日历
2015/10/28 Javascript
浅谈jQuery双事件多重加载的问题
2016/10/05 Javascript
浅谈js的ajax的异步和同步请求的问题
2016/10/07 Javascript
JavaScript之promise_动力节点Java学院整理
2017/07/03 Javascript
微信小程序 配置顶部导航条标题颜色的实现方法
2017/09/20 Javascript
利用nodeJs anywhere搭建本地服务器环境的方法
2018/05/12 NodeJs
nodejs取得当前执行路径的方法
2018/05/13 NodeJs
LayUi数据表格自定义赋值方式
2019/10/26 Javascript
vscode 插件开发 + vue的操作方法
2020/06/05 Javascript
Openlayers实现点闪烁扩散效果
2020/09/24 Javascript
[02:49]DAC2018决赛日TOP5 LGD开启黑暗之门绝杀VP
2018/04/08 DOTA
Django中login_required装饰器的深入介绍
2017/11/24 Python
Python-OpenCV基本操作方法详解
2018/04/02 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
2019/04/28 Python
Anaconda3中的Jupyter notebook添加目录插件的实现
2020/05/18 Python
Python 实现键盘鼠标按键模拟
2020/11/18 Python
亚马逊中国官方网站:amazon.cn
2017/05/25 全球购物
岗位职责定义及内容
2013/11/08 职场文书
自主招生自荐书
2013/11/29 职场文书
学校党的群众路线教育实践活动对照检查材料
2014/09/24 职场文书
党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
2015年生活老师工作总结
2015/05/27 职场文书
go开发alertmanger实现钉钉报警
2021/07/16 Golang