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 相关文章推荐
set_include_path在win和linux下的区别
Jan 10 PHP
PHP入门学习笔记之一
Oct 12 PHP
Ajax实时验证用户名/邮箱等是否已经存在的代码打包
Dec 01 PHP
基于session_unset与session_destroy的区别详解
Jun 03 PHP
PHP保留两位小数并且四舍五入及不四舍五入的方法
Sep 22 PHP
php给图片加文字水印
Jul 31 PHP
WordPress中获取页面链接和标题的相关PHP函数用法解析
Dec 17 PHP
PHP时间类完整实例(非常实用)
Dec 25 PHP
Yii列表定义与使用分页方法小结(3种方法)
Jul 15 PHP
ajax+php实现无刷新验证手机号的实例
Dec 22 PHP
Laravel框架实现定时发布任务的方法
Aug 16 PHP
php简单检测404页面的方法示例
Aug 23 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
40个迹象表明你还是PHP菜鸟
2008/09/29 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
2014/07/01 PHP
yii操作cookie实例简介
2014/07/09 PHP
php检测数组长度函数sizeof与count用法
2014/11/17 PHP
php实现的Curl封装类Curl.class.php用法实例分析
2015/09/25 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/01/13 Javascript
javascript在一段文字中的光标处插入其他文字
2007/08/26 Javascript
javascript &amp;&amp;和||运算法的另类使用技巧
2009/11/28 Javascript
利用location.hash实现跨域iframe自适应
2010/05/04 Javascript
JQuery 控制内容长度超出规定长度显示省略号
2014/05/23 Javascript
JavaScript中字符串与Unicode编码互相转换的实现方法
2015/12/18 Javascript
基于BootStrap Metronic开发框架经验小结【五】Bootstrap File Input文件上传插件的用法详解
2016/05/12 Javascript
微信小程序 navigation API实例详解
2016/10/02 Javascript
超全面的vue.js使用总结
2017/02/12 Javascript
jQuery的三种bind/One/Live/On事件绑定使用方法
2017/02/23 Javascript
微信小程序 setData使用方法及常用错误解决办法
2017/05/11 Javascript
通过函数作用域和块级作用域看javascript的作用域链
2018/08/05 Javascript
Vue 利用指令实现禁止反复发送请求的两种方法
2019/09/15 Javascript
layer.open提交子页面的form和layedit文本编辑内容的方法
2019/09/27 Javascript
layui数据表格 table.render 报错的解决方法
2019/09/29 Javascript
vue项目中定义全局变量、函数的几种方法
2019/11/08 Javascript
JS中的继承操作实例总结
2020/06/06 Javascript
JavaScript中CreateTextFile函数
2020/08/30 Javascript
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
2014/04/26 Python
Python中的jquery PyQuery库使用小结
2014/05/13 Python
Python基于递归实现电话号码映射功能示例
2018/04/13 Python
python文件拆分与重组实例
2018/12/10 Python
Python3日期与时间戳转换的几种方法详解
2019/06/04 Python
Django项目中使用JWT的实现代码
2019/11/04 Python
Python解压 rar、zip、tar文件的方法
2019/11/19 Python
Janie and Jack美国官网:GAP旗下的高档童装品牌
2019/09/09 全球购物
什么是跨站脚本攻击
2014/12/11 面试题
什么是索引指示器
2012/08/20 面试题
大学生简历自我评价2015
2015/03/03 职场文书
城南旧事电影观后感
2015/06/16 职场文书