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 相关文章推荐
如何过滤高亮显示非法字符
Oct 09 PHP
php中var_export与var_dump的区别分析
Aug 21 PHP
php curl常见错误:SSL错误、bool(false)
Dec 28 PHP
Symfony页面的基本创建实例详解
Jan 26 PHP
PHP网络操作函数汇总
May 18 PHP
盘点PHP和ASP.NET的10大对比!
Dec 24 PHP
前端必学之PHP语法基础
Jan 01 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
May 20 PHP
Yii2使用表单上传文件的实例代码
Aug 03 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
Aug 17 PHP
使用Laravel中的查询构造器实现增删改查功能
Sep 03 PHP
常见的5个PHP编码小陋习以及优化实例讲解
Feb 27 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极大的增强功能和性能
2006/10/09 PHP
PHP中GET变量的使用
2006/10/09 PHP
使用phpQuery采集网页的方法
2013/11/13 PHP
php类自动加载器实现方法
2015/07/28 PHP
PHP中的表达式简述
2016/05/29 PHP
PHP网页缓存技术优点及代码实例
2020/07/29 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
2020/10/27 PHP
json 定义
2008/06/10 Javascript
jquery 模拟类搜索框自动完成搜索提示功能(改进)
2010/05/24 Javascript
为JS扩展Array.prototype.indexOf引发的问题及解决办法
2015/01/21 Javascript
js实现类似新浪微博首页内容渐显效果的方法
2015/04/10 Javascript
Vue.js实现表格动态增加删除的方法(附源码下载)
2017/01/20 Javascript
Vue 父子组件、组件间通信
2017/03/08 Javascript
基于Jquery Ajax type的4种类型(详解)
2017/08/02 jQuery
详解无限滚动插件vue-infinite-scroll源码解析
2019/05/12 Javascript
Vue中使用better-scroll实现轮播图组件
2020/03/07 Javascript
解决vue做详情页跳转的时候使用created方法 数据不会更新问题
2020/07/24 Javascript
Python socket实现的简单通信功能示例
2018/08/21 Python
python3.6使用urllib完成下载的实例
2018/12/19 Python
python使用selenium实现批量文件下载
2019/03/11 Python
python同步两个文件夹下的内容
2019/08/29 Python
python add_argument()用法解析
2020/01/29 Python
基于python调用jenkins-cli实现快速发布
2020/08/14 Python
python3排序的实例方法
2020/10/20 Python
Html5 web本地存储实例详解
2016/07/28 HTML / CSS
意大利在线高尔夫商店:Online Golf
2021/03/09 全球购物
GC是什么?为什么要有GC?
2013/12/08 面试题
学生会主席事迹材料
2014/01/28 职场文书
音乐教学案例
2014/01/30 职场文书
幼儿园健康教育方案
2014/06/14 职场文书
规范化管理年活动总结
2014/08/29 职场文书
不听老师话的万能检讨书
2014/10/04 职场文书
公务员年终个人总结
2015/02/12 职场文书
对公司的意见和建议
2015/06/04 职场文书
感恩主题班会教案
2015/08/12 职场文书
企业内部管理控制:采购授权审批制度范本
2020/01/19 职场文书