美文网首页
二分查找隐藏的那个bug

二分查找隐藏的那个bug

作者: 小伟_be27 | 来源:发表于2019-05-02 16:56 被阅读0次

看一段二分查找代码

function binarySearch($arr,$target){
    $low = 0;
    $hight = count($arr)-1;
    while($low <=$hight){
        $mid = ($low+$hight) /2;
        if($target == $arr[$mid]){
            return $mid;
        }elseif ($target < $arr[$mid]){ //左边找
            $hight = $mid - 1;
        }else{  //右边找
            $low = $mid + 1;
        }
    }
    return -1;
}

递归实现

function binarysearch2($arr,$low,$hight,$target){
    if($low <=$hight){
        $mid = ($low + $hight) / 2;
        if($target == $arr[$mid]){ 
            echo $mid;
        }elseif($target < $arr[$mid]){  //左边找
            binarysearch2($arr,$low,$mid-1,$target);
        }else{   //右边找
            binarysearch2($arr,$mid+1,$hight,$target);
        }
    }else{
        echo -1;
    }
}

当low+high的值超过了最大的正int值 (231 - 1) 的时候, mid会变成负值, 这个时候会抛出异常
正确的方法是:
mid = (low+hight) /2 替换为:mid = low+(hight-$low) /2;

若查找元素在数组中重复出现的话,可以修改一下代码
支持php5.4以上版本

function binarySearch3($arr,$target){
    $indexArr = array();
    $low = 0;
    $hight = count($arr)-1;
    while($low <=$hight){
        // $mid = ($low+$hight) /2;
        $mid = $low+($hight-$low) /2;
        if($target == $arr[$mid]){      //找到第一个相同元素
            $mid = $mid -1;             //左边找相同元素
            while($mid >= $low && $arr[$mid] == $target){  
                $indexArr[] = $mid;
                $mid--;
            }
            $mid = $mid +1;             //右边找相同元素
            while($mid <= $hight && $arr[$mid] == $target){
                $indexArr[] = $mid;
                $mid++;
            }
            return $indexArr;
        }elseif ($target < $arr[$mid]){ //左边找
            $hight = $mid - 1;
        }else{  //右边找
            $low = $mid + 1;
        }
    }
    return -1;
}

相关文章

  • 二分查找隐藏的那个bug

    看一段二分查找代码 递归实现 当low+high的值超过了最大的正int值 (231 - 1) 的时候, mid会...

  • 数据结构和算法--二分查找

    二分查找 二分查找的思想 二分查找(Binary Search)算法,也叫折半查找算法。 二分查找针对的是一个有序...

  • python二分查找算法

    文章概述 二分查找法介绍 简单查找与二分查找对比 二分查找  二分查找算法主要思想:在有序列表中查找指定元素,先从...

  • 二分查找

    [TOC] 二分查找的基础模板 二分查找靠左的Index基础模板 二分查找靠右的Index基础模板 二分查找插入t...

  • 二分查找

    什么是二分查找?二分查找,也叫折半查找(Binary Search),它是一种效率较高的查找方法。二分查找的条件:...

  • 分治算法(swift二分法排序递归实现)

    二分查找 1、二分查找(Binary Search) 2、二分查找的基本思想 swift算法实现

  • git bisect二分查找使用

    使用 git bisect 二分查找定位bug 原理 原理: 将代码提交的历史,按照两分法不断缩小定位。所谓"...

  • git bisect二分查找使用

    使用 git bisect 二分查找定位bug 原理 原理: 将代码提交的历史,按照两分法不断缩小定位。所谓"...

  • 可查找重复元素的二分查找算法

    可查找重复元素的二分查找算法 二分查找算法思想:又称为 折半查找,二分查找适合对已经排序好的数据集合进行查找。假设...

  • 二分查找法

    二分查找法 二分查找法(递归)

网友评论

      本文标题:二分查找隐藏的那个bug

      本文链接:https://www.haomeiwen.com/subject/zbinnqtx.html