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

为什么二进制搜索对这个无序数组有效?

薛滨海
2023-03-14

考虑到这个问题:峰值元素是一个大于相邻元素的元素。

给定一个输入数组,其中num[i]≠ num[i 1],找到一个peak元素并返回其索引。

该数组可以包含多个峰值,在那种情况下将索引返回到任何一个峰值都是精细的。

示例:Array=[1,4,5,7,4,3,1]。峰值指数=3(即7)。

下面的代码非常有效(不仅仅适用于此测试用例):

    public static int getPeakElement(int[] array, int left, int right) {

    if (left == right) {
        return left;
    }

    int mid = (left + right) / 2;

    if (array[mid] > array[mid + 1]) {
        return getPeakElement(array, left, mid);
    }

    return getPeakElement(array, mid + 1, right);
}   

我不明白它是如何工作的——我以为二进制搜索只是用于排序数组/旋转数组。

共有2个答案

柯昆
2023-03-14

如果有多个峰值,则不需要对数组进行排序。排序实际上会去除除一个峰值以外的所有峰值。

这个代码是如何工作的?想象一下,你在一条崎岖不平的路上,需要找到一座山峰——但你是盲人,所以你看不见它,只能凭感觉工作。你从某个点开始,根据你所处点的坡度,检查你是否必须向左或向右移动(你向左和向右移动一只脚,感觉你击中了什么)。然后你迈出一大步(你是神奇小姐,所以huuge steps对你来说不是问题),再次检查新位置的坡度。你重复这一步,减小步长,直到你到达一个点,左右都是下坡,所以你达到了一个峰值。

房子昂
2023-03-14

如果“峰值”的定义仅仅是它是一个比周围元素大的元素,那么你可以解释它为什么工作。

if (array[mid] > array[mid + 1]) {
    return getPeakElement(array, left, mid);
}

return getPeakElement(array, mid + 1, right);

条件是:

  • 如果中间的元素比相邻的元素大,它可能是峰值——它肯定比右边的元素大。在“左手”的一半范围内搜索一个至少同样大的峰值

随着递归的进行,您知道:

  • 左-1在数组之外,或者那里的元素小于arr[左]处的元素(否则你不会选择这一半)
  • right 1在数组之外,或者那里的元素小于arr[right]处的元素(否则你不会选择这一半)。

你继续,直到↓==right,这时你知道你已经到达了峰值,因为相邻的元素更少(或者你在数组的一端或另一端)。

 类似资料:
  • (sharth的评论已经回答了这个问题。) 我已经用python编写了一个二进制搜索算法,它或多或少遵循与在bisect模块中找到的bisect_left函数相同的结构。事实上,它有几个较少的条件,因为我知道,高点是列表的长度,低点是0。然而由于某种原因,内置函数的运行速度是我的5倍。 我的代码如下: 内置函数的源代码是: 正如你所看到的,几乎完全相同。然而,my函数(在100000字的有序列表中

  • 问题内容: 我的任务是创建一个方法,该方法将打印在排序数组中找到值x的所有索引。 我知道,如果我们仅从0到N(数组的长度)对数组进行扫描,则最坏情况下的运行时间为O(n)。由于将对传递给该方法的数组进行排序,因此我假设我可以利用二进制搜索的优势,因为这将是O(log n)。但是,这仅在数组具有唯一值的情况下有效。因为二进制搜索将在特定值的第一个“查找”之后完成。我当时正在考虑进行二进制搜索,以便在

  • 我在看麻省理工学院的开放课件的第一次讲座,关于算法的介绍,有一些东西对我来说并不是很明显。你不能在这里观看24:30的讲座和课堂讲稿,这里有一维峰值问题的定义和解决方案的所有细节 问题是: 对于由“n”个整数元素组成的数组,找到一个峰值 我的问题/担心 既然在中有上述条件,为什么要往左走?而不是右边? 既然在中有上述条件,为什么要往右边走?而不是左边? 二进制搜索算法假设我们从排序的数组开始,那么

  • 问题内容: 我有一个排序的数组,想要对它进行二进制搜索。 所以我想问一下Swift库中是否已有诸如sort等的东西?还是有类型独立版本可用? 当然,我可以自己编写它,但是我想避免再次发明轮子。 问题答案: 这是使用二进制搜索的通用方法:

  • 我想输出给定值数组的二叉搜索树。它遵循二叉搜索树原理。图表向左旋转 这是所需的输出: 我该怎么修

  • 我想实现一种将排序数组插入二叉搜索树的算法,但我不希望最终得到一棵只向一侧生长的树。 你有什么想法吗? 谢谢你。