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写的MySQL数据库用户认证系统代码
Mar 22 PHP
php数组应用之比较两个时间的相减排序
Aug 18 PHP
PHP加速 eAccelerator配置和使用指南
Jun 05 PHP
部署PHP项目应该注意的几点事项分享
Dec 20 PHP
php中eval函数的危害与正确禁用方法
Jun 30 PHP
laravel学习教程之关联模型
Jul 30 PHP
php输出图像的方法实例分析
Feb 16 PHP
php处理静态页面:页面设置缓存时间实例
Jun 22 PHP
PDO::_construct讲解
Jan 27 PHP
php设计模式之单例模式用法经典示例分析
Sep 20 PHP
php使用自带dom扩展进行元素匹配的原理解析
May 29 PHP
TP3.2框架分页相关实现方法分析
Jun 03 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 Smarty date_format [格式化时间日期]
2010/03/15 PHP
PHP GD 图像处理组件的常用函数总结
2010/04/28 PHP
Win2003+apache+PHP+SqlServer2008 配置生产环境
2014/07/29 PHP
PHP实现模仿socket请求返回页面的方法
2014/11/04 PHP
使用PHP把HTML生成PDF文件的几个开源项目介绍
2014/11/17 PHP
PHP写的简单数字验证码实例
2017/05/23 PHP
JavaScript 学习技巧
2010/02/17 Javascript
仿微博字符限制效果实现代码
2012/04/20 Javascript
图片轮换效果实现代码(点击按钮停止执行)
2013/04/12 Javascript
jQuery自定义添加&quot;$&quot;与解决&quot;$&quot;冲突的方法
2015/01/19 Javascript
JS中处理时间之setUTCMinutes()方法的使用
2015/06/12 Javascript
基于JS实现textarea中获取动态剩余字数的方法
2016/05/25 Javascript
谈谈JavaScript中浏览器兼容问题的写法小议
2016/12/17 Javascript
基于jQuery实现左侧菜单栏可折叠功能
2016/12/27 Javascript
js css自定义分页效果
2017/02/24 Javascript
webpack开发跨域问题解决办法
2017/08/03 Javascript
Javascript(es2016) import和require用法和区别详解
2017/08/11 Javascript
利用不到200行代码写一款属于你自己的js类库
2019/07/08 Javascript
[01:18:36]LGD vs VP Supermajor 败者组决赛 BO3 第一场 6.10
2018/07/04 DOTA
python 从远程服务器下载东西的代码
2013/02/10 Python
浅谈tensorflow1.0 池化层(pooling)和全连接层(dense)
2018/04/27 Python
Python实现将多个空格换为一个空格.md的方法
2018/12/20 Python
Python最小二乘法矩阵
2019/01/02 Python
python爬虫简单的添加代理进行访问的实现代码
2019/04/04 Python
Python面向对象之多态原理与用法案例分析
2019/12/30 Python
详解python的super()的作用和原理
2020/10/29 Python
python实现excel公式格式化的示例代码
2020/12/23 Python
Linux开机引导的步骤是什么
2015/10/19 面试题
如果让你测试一台高速激光打印机,你都会进行哪些测试
2012/12/04 面试题
婚礼答谢礼品
2015/01/20 职场文书
2015年度信用社工作总结
2015/05/04 职场文书
《失物招领》教学反思
2016/02/20 职场文书
Go语言中的UTF-8实现
2021/04/26 Golang
Python入门之使用pandas分析excel数据
2021/05/12 Python
js Proxy的原理详解
2021/05/25 Javascript
SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)
2023/05/08 MySQL