当前位置: 首页 > 知识库问答 >
问题:

二进制搜索开始或结束是目标

公良光熙
2023-03-14

为什么当我看到二进制搜索的示例代码时,从来没有一个if语句来检查数组的开始还是结束是目标?

import java.util.Arrays;

public class App {

    public static int binary_search(int[] arr, int left, int right, int target) {
        if (left > right) {
            return -1;
        }

        int mid = (left + right) / 2;

        if (target == arr[mid]) {
            return mid;
        }

        if (target < arr[mid]) {
            return binary_search(arr, left, mid - 1, target);
        }

        return binary_search(arr, mid + 1, right, target);
    }

    public static void main(String[] args) {
        int[] arr = { 3, 2, 4, -1, 0, 1, 10, 20, 9, 7 };

        Arrays.sort(arr);
        for (int i = 0; i < arr.length; i++) {
            System.out.println("Index: " + i + " value: " + arr[i]);
        }

        System.out.println(binary_search(arr, arr[0], arr.length - 1, -1));
    }
}

在本例中,如果目标是-1或20,搜索将进入递归。但是它添加了一个if语句来检查目标是否是mid,那么为什么不添加两个语句来检查它的左边还是右边呢?

共有1个答案

韦衡
2023-03-14

你似乎有一种印象,“他们为中间添加了一个额外的支票,所以他们肯定也应该为开始和结束添加一个额外的支票”。

检查“是在目标中间吗?”事实上不仅仅是他们添加的优化。递归地检查“mid”是二进制搜索的全部要点。

当您有一个排序的元素数组时,二进制搜索是这样工作的:

    null

对于一个拥有数十亿条目的大规模现实世界数据集?嗯,让我们考虑一下。为了简单起见,我们假定我们知道目标在数组中。

我们从整个阵列开始。第一个元素是目标吗?这种可能性是十亿分之一。不太可能。最后一个元素是目标吗?这种可能性也是十亿分之一。也不太可能。您浪费了两个额外的比较来加速一个极不可能的情况。

我们把自己限制在,比如说,前半部分。我们又做同样的事情。第一个元素是目标吗?可能不会,因为几率是5亿分之一。

 类似资料:
  • 我有一个问题,当查询搜索进程与Firebase Rest API。我使用startAt和endAt参数进行第一次和最后一次搜索,但它仍然没有列出。 我有一个像上面这样的输出。有两批货名为白车和红车。当我找车的时候,我希望他们两个都出来。我哪里犯错了?

  • 在这个指南中你学习了关于思考、设计和构建动画的基础。我记得当我第一次进入动画开发并让我的第一个对象在屏幕上移动的时候,它完全使我震惊了。它真的改变了我,和我的工作。我不再是仅仅将静止的app模型放到Photoshop中,或者在Keynote或其他工具中做一些可点击的模型,我真的构建了可以运行在我的手机的上界面!那是2008年,在真正酷的弹簧动画框架出现之前,所以当时只是使用了简单的淡入淡出。现在,

  • 二进制搜索是一种快速搜索算法,运行时复杂度为Ο(log n)。 这种搜索算法的工作原则是分而治之。 为使此算法正常工作,数据收集应采用排序形式。 二进制搜索通过比较集合的最中间项来查找特定项。 如果匹配发生,则返回项目的索引。 如果中间项大于项,则在中间项左侧的子阵列中搜索项。 否则,在中间项右侧的子阵列中搜索项。 该过程也在子阵列上继续,直到子阵列的大小减小到零。 二进制搜索如何工作? 要使二进

  • 给定二叉查找树(BST)和整数val的根。 在BST中找到该节点的值等于val的节点,并返回以该节点为根的子树。如果这样的节点不存在,则返回null。 为什么'ans=root'不起作用??

  • 问题内容: 我知道Go有一个包含搜索功能的程序包,但这是出于教育目的。我一直在尝试在Go中实现二进制搜索算法,但无法使其正常工作。 这是我的代码: 它总是打印。为什么? 问题答案: 二进制搜索的逻辑是合理的。唯一的问题是您忘记了将每个递归调用的结果分配给和。 当前,您有以下这些递归调用: 您只需要分配结果:

  • 这是我第一次使用这个平台提问。我想知道以下代码有什么问题,它们没有在主代码末尾打印出目标数字的索引。发生了什么?祝那些阅读本文的人度过愉快的一天。