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中将网址转换为超链接的函数
Sep 02 PHP
smarty基础之拼接字符串的详解
Jun 18 PHP
php 判断服务器操作系统的类型
Feb 17 PHP
destoon官方标签大全
Jun 20 PHP
php array_merge_recursive 数组合并
Oct 26 PHP
php常用数组函数实例小结
Dec 29 PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 PHP
layui框架实现文件上传及TP3.2.3(thinkPHP)对上传文件进行后台处理操作示例
May 12 PHP
PHP从尾到头打印链表实例讲解
Sep 27 PHP
PHP封装的mysqli数据库操作类示例
Feb 16 PHP
Laravel 在views中加载公共页面的实现代码
Oct 22 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操作mysql执行数据库查询的一些常用操作汇总
2013/06/24 PHP
关于PHPDocument 代码注释规范的总结
2013/06/25 PHP
PHP 动态生成静态HTML页面示例代码
2014/01/15 PHP
thinkPHP多语言切换设置方法详解
2016/11/11 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
2019/08/14 PHP
jquery tablesorter.js 支持中文表格排序改进
2009/12/09 Javascript
jQuery.extend 函数详解
2012/02/03 Javascript
js创建表单元素并使用submit进行提交
2014/08/14 Javascript
JS实现新浪微博效果带遮罩层的弹出框代码
2015/10/12 Javascript
详述JavaScript实现继承的几种方式(推荐)
2016/03/22 Javascript
JavaScript键盘事件常见用法实例分析
2019/01/03 Javascript
微信小程序如何使用canvas二维码保存至手机相册
2019/07/15 Javascript
python基础教程之常用运算符
2014/08/29 Python
整理Python 常用string函数(收藏)
2016/05/30 Python
Python实现KNN邻近算法
2021/01/28 Python
python opencv之SIFT算法示例
2018/02/24 Python
python生成不重复随机数和对list乱序的解决方法
2018/04/09 Python
python for循环输入一个矩阵的实例
2018/11/14 Python
Python基础学习之函数方法实例详解
2019/06/18 Python
Django后端接收嵌套Json数据及解析详解
2019/07/17 Python
对Python 中矩阵或者数组相减的法则详解
2019/08/26 Python
opencv python图像梯度实例详解
2020/02/04 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
2020/03/09 Python
在django中实现choices字段获取对应字段值
2020/07/12 Python
移动端Web页面的CSS3 flex布局快速上手指南
2016/05/31 HTML / CSS
18岁生日感言
2014/01/12 职场文书
会计辞职信范文
2014/01/15 职场文书
幼儿教师考核制度
2014/01/25 职场文书
入党自我评价范文
2014/02/02 职场文书
天猫某品牌专卖店运营计划书
2014/03/21 职场文书
“九一八事变纪念日”国旗下讲话稿
2014/09/14 职场文书
幼儿教师自我剖析材料
2014/09/29 职场文书
入伍通知书
2015/04/23 职场文书
歌咏比赛主持词
2015/06/29 职场文书
2016年圣诞节寄语(一句话)
2015/12/07 职场文书
利用Python第三方库实现预测NBA比赛结果
2021/06/21 Python