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 相关文章推荐
用libtemplate实现静态网页生成
Oct 09 PHP
Windows中安装Apache2和PHP4权威指南
Nov 18 PHP
中英文字符串翻转函数
Dec 09 PHP
php动态生成函数示例
Mar 21 PHP
Laravel 4.2 中队列服务(queue)使用感受
Oct 30 PHP
php输出指定时间以前时间格式的方法
Mar 21 PHP
PHP简单操作MongoDB的方法(安装及增删改查)
May 26 PHP
PHP简单判断手机设备的方法
Aug 23 PHP
适合PHP初学者阅读的4本经典书籍
Sep 23 PHP
php实现的错误处理封装类实例
Jun 20 PHP
thinkphp5 模型实例化获得数据对象的教程
Oct 18 PHP
PHP Pipeline 实现中间件的示例代码
Apr 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 中的面向对象编程:通向大型 PHP 工程的办法
2006/12/03 PHP
基于php socket(fsockopen)的应用实例分析
2013/06/02 PHP
PHP内存缓存功能memcached示例
2016/10/19 PHP
laravel 操作数据库常用函数的返回值方法
2019/10/11 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现代码
2010/09/19 Javascript
jQuery的初始化与对象构建之浅析
2011/04/12 Javascript
jQuery的attr与prop使用介绍
2013/10/10 Javascript
页面装载js及性能分析方法介绍
2014/03/21 Javascript
基于JQuery制作可编辑的表格特效
2014/12/23 Javascript
JSON格式的键盘编码对照表
2015/01/29 Javascript
angularjs在ng-repeat中使用ng-model遇到的问题
2016/01/21 Javascript
Angular实现一个简单的多选复选框的弹出框指令实例
2017/04/25 Javascript
socket.io学习教程之深入学习篇(三)
2017/04/29 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
2018/04/19 Javascript
webpack项目使用eslint建立代码规范实现
2019/05/16 Javascript
Selenium 模拟浏览器动态加载页面的实现方法
2018/05/16 Python
用pandas中的DataFrame时选取行或列的方法
2018/07/11 Python
TensorFlow Session使用的两种方法小结
2018/07/30 Python
python批量图片处理简单示例
2019/08/06 Python
Python接口测试文件上传实例解析
2020/05/22 Python
CSS3中几个新增加的盒模型属性使用教程
2016/03/01 HTML / CSS
HTML5样式控制示例代码
2013/11/27 HTML / CSS
HTML5 drag和drop具体使用详解
2021/01/18 HTML / CSS
微软美国官方网站:Microsoft美国
2018/05/10 全球购物
估算杭州有多少软件工程师
2015/08/11 面试题
打架检讨书50字
2014/01/11 职场文书
初一体育教学反思
2014/01/29 职场文书
正科级干部考察材料
2014/05/29 职场文书
专科应届毕业生求职信
2014/06/04 职场文书
尊老爱幼演讲稿
2014/09/04 职场文书
大学生撤销处分思想汇报
2014/09/12 职场文书
学生顶撞老师的检讨书
2014/09/17 职场文书
公司捐书倡议书
2015/04/27 职场文书
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python
Vue操作Storage本地化存储
2022/04/29 Vue.js