• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP基础二分查找代码实现

php 搞代码 3年前 (2022-03-01) 11次浏览 已收录 0个评论

原文链接: 何晓东 技术博客

基础的二分查找就是:在一组有序的集合中,查找指定值,稍微延伸一下就是指定值在集合中多次出现,需要查询第一次出现的位置或者最后一次出现的位置。这种分三种情况讨论。二分查找的维基百科定义:搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

无重复值的查找

<code class="php">function binarySearch($nums, $target) {
    $left = 0;
    $right = count($nums) - 1;
    while ($left <= $right) {
        $mid = (int)($left + ($right - $left) / 2);   // 防止 left + right 会整数溢出
        if ($nums[$mid] == $target) {
            return $mid;   // 匹配到就返回
        } elseif ($nums[$mid] > $target) {
            $right = $mid - 1;
        } elseif ($nums[$mid] < $target) {
            $left = $mid + 1;
        }
    }

    return -1;
}

return binarySearch([-1,0,3,5,9,12], 9);  // output: 4

查找指定值的左侧边界

<code class="php">function binarySearch($nums, $target) {
    $left = 0;
    $right = count($nums) - 1;
    while ($left <= $right) {
        $mid = (int)($left + ($right - $left) / 2);
        if ($nums[$mid] == $target) {
            $right = $mid - 1;   // 锁定左边,移动右边界
        } elseif ($nums[$mid] > $target) {
            $right = $mid - 1;
        } elseif ($nums[$mid] < $target) {
            $left = $mid + 1;
        }
    }

    if ($left >= count($nums) || $nums[$left] != $target)
        return -1;

    return $left;
}

return binarySearch([-1,0,3,5,9,9,9,12], 9);  // output: 4

寻找指定值的右侧边界

<code class="php">function binarySearch($nums, $target) {
    $left = 0;
    $right = count($nums) - 1;
    while ($left <= $right) {
        $mid = (int)($left + ($right - $left) / 2);
        if ($nums[$mid] == $target) {
            $left = $mid + 1;   // 锁定右边,移动左边界
        } elseif ($nums[$mid] > $target) {
            $right = $mid - 1;
        } elseif ($nums[$mid] < $target) {
            $left = $mid + 1;
        }
    }

    if ($right < 0 || $nums[$right] != $target)
        return -1;

    return $right;
}

return binarySearch([-1,0,3,5,9,9,9,12], 9);  // output: 6

参考链接:

  1. 二分查找解题框架思路,强烈推荐这个网站的作者

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP基础二分查找代码实现
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址