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生成静态页面分析 模板+缓存+写文件
Aug 17 PHP
在WINDOWS中设置计划任务执行PHP文件的方法
Dec 19 PHP
PHP中的错误处理、异常处理机制分析
May 07 PHP
php动态实现表格跨行跨列实现代码
Nov 06 PHP
如何利用PHP执行.SQL文件
Jul 05 PHP
一个完整的PHP类包含的七种语法说明
Jun 04 PHP
PHP正则表达式之捕获组与非捕获组
Nov 06 PHP
php使用pdo连接sqlite3的配置示例
May 27 PHP
常用PHP封装分页工具类
Jan 14 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
Jul 20 PHP
PHP远程连接oracle数据库操作实现方法图文详解
Apr 11 PHP
Yii redis集合的基本使用教程
Jun 14 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实现的生成静态HTML速度快类库
2007/03/31 PHP
PHP的autoload自动加载机制使用说明
2010/12/28 PHP
IIS6.0 开启Gzip方法及PHP Gzip函数分享
2014/06/08 PHP
php实现图片转换成ASCII码的方法
2015/04/03 PHP
php验证身份证号码正确性的函数
2016/07/20 PHP
filemanage功能中用到的lib.js
2007/04/08 Javascript
IE下js调试工具Companion.JS
2010/10/15 Javascript
JQuery1.6 使用方法三
2011/11/23 Javascript
JavaScript学习笔记之Cookie对象
2015/01/22 Javascript
jQuery动态修改超链接地址的方法
2015/02/13 Javascript
深入探讨javascript中的数据类型
2015/03/04 Javascript
jQuery实现浮动层随浏览器滚动条滚动的方法
2015/09/22 Javascript
JavaScript实现倒计时代码段Item1(非常实用)
2015/11/03 Javascript
jQuery+Pdo编写login登陆界面
2016/08/01 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
NodeJS配置HTTPS服务实例分享
2017/02/19 NodeJs
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/15 Javascript
浅谈angularjs中响应回车事件
2017/04/24 Javascript
JS隐藏号码中间4位代码实例
2019/04/09 Javascript
jQuery实现的移动端图片缩放功能组件示例
2020/05/01 jQuery
Python中的面向对象编程详解(上)
2015/04/13 Python
Python datetime包函数简单介绍
2019/08/28 Python
Python list和str互转的实现示例
2020/11/16 Python
pycharm中选中一个单词替换所有重复单词的实现方法
2020/11/17 Python
英国珠宝和手表专家:Pleasance & Harper
2020/10/21 全球购物
教师专业理论水平的自我评价分享
2013/11/09 职场文书
数控专业个人求职信范文
2014/02/05 职场文书
抽奖活动主持词
2014/03/31 职场文书
体育课课后反思
2014/04/24 职场文书
社区文化建设方案
2014/05/02 职场文书
党的群众路线对照检查材料(个人)
2014/09/24 职场文书
查摆问题整改措施范文
2014/10/11 职场文书
2015清明节祭奠英烈寄语大全
2015/03/04 职场文书
秋收起义观后感
2015/06/11 职场文书
实习报告范文
2019/07/30 职场文书
详解Python类和对象内容
2021/06/22 Python