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

为什么二分搜索算法对这个一维“寻峰”问题有效?

温翔宇
2023-03-14

我在看麻省理工学院的开放课件的第一次讲座,关于算法的介绍,有一些东西对我来说并不是很明显。你不能在这里观看24:30的讲座和课堂讲稿,这里有一维峰值问题的定义和解决方案的所有细节

问题是:

对于由“n”个整数元素组成的数组,找到一个峰值

example[1] >= example[0] && example[1] >= example[2] #=> is true and therefore a peak
example[7] >= example[6] #=> is true and therefore a peak

我的问题/担心

  1. 既然在a中有上述条件,为什么要往左走?而不是右边?
  2. 既然在b中有上述条件,为什么要往右边走?而不是左边?
  3. 二进制搜索算法假设我们从排序的数组开始,那么将它应用于可能未排序的数据有什么意义呢?
  4. 解决方案是否保证,对于只有一个“峰值”的情况,我们最初不会丢弃包含峰值的那一半?如果是,如何/为什么?

由于数组可能是未排序的,并且可能包含重复项,我不明白哪里可以保证如果AB中的条件为真,那么向右或向左查找都是有意义的,这在我看来是任意的,如果选择错误,可以丢弃数组中实际上可能有唯一峰值的一半

共有1个答案

宋稳
2023-03-14

既然上面的条件在A中,为什么要往左走?而不是权利?

如果你去右边(不首先检查条件B),有一个小概率,在右边的值将继续下降(从左到右),你不会在那里找到一个峰值。

然而,在左边,你知道你不可能有这种情况,因为你已经找到了至少一个更高的值(邻居),甚至可能是一个峰值。以下是如何证明在左侧存在峰值(这不是对算法的描述;只是证明它的一种方法):

这当然是同样的推理,但也是镜像的。

注意,您可以决定首先检查条件B,然后才检查A。当两个条件同时为真时,您实际上可以选择走哪一边。这就是你从选择看起来“武断”的感觉。当条件A和条件B都为真时,它确实是任意的。

但也要想想A和B中的一个是真的,另一个是假的情况。如果你走错了(向下)的路,你就不能保证价值会朝着那个方向上升。所以有一个小概率,在那一边没有峰值。

 类似资料:
  • 我在看麻省理工学院的开放课件《算法入门第一讲》,有一些东西对我来说并不是很明显。你不能在这里开始看24:30的讲课,也不能在这里看课堂讲稿,里面有关于一维峰值问题定义和解法的所有细节 问题在于: 对于由“n”个整数元素组成的数组,找到一个峰值 从这个例子中,我们可以理解阵列可能是未排序的,它可能包含重复的,并且它可能包含一个以上的峰,并且根据我的解释,它甚至可能不包含任何单个峰。 到目前为止还不错

  • 我在写一个程序,你可以输入一个单词,它将被存储在一个数组列表中。然后,您可以通过在文本字段中输入这些词并按下按钮来搜索这些词。(如果按下另一个按钮,也可以对它们进行排序)。如果找到了这个词,就应该打印出这个词在ArrayList中的位置,如果找不到,就应该打印出来。直到最近我测试它的时候,我一直认为这是可行的(以前也是可行的):我输入了一个我知道在ArrayList中的单词,这样它就可以打印出这个

  • 考虑到这个问题:峰值元素是一个大于相邻元素的元素。 给定一个输入数组,其中num[i]≠ num[i 1],找到一个peak元素并返回其索引。 该数组可以包含多个峰值,在那种情况下将索引返回到任何一个峰值都是精细的。 示例:Array=[1,4,5,7,4,3,1]。峰值指数=3(即7)。 下面的代码非常有效(不仅仅适用于此测试用例): 我不明白它是如何工作的——我以为二进制搜索只是用于排序数组/

  • 问题内容: 我已经为Employee类的父类是抽象的并且父类中的clone()方法是抽象的编写了此克隆方法。我想用此代码复制Employee对象的原始数据类型,而不是复制每个原始数据单独键入,但是此代码在我调用clone()方法的行中有问题。(此代码在Employee类中) 错误是:来自对象类型的方法clone()不可见。 但是我的Employee类在类层次结构中,可以访问Object类中受保护的

  • 问题内容: 我一直在使用一些使用许多ajax请求呈现页面的高级javascript应用程序。要使应用程序可抓取(通过Google),我必须遵循https://developers.google.com/webmasters/ajax- crawling/?hl=fr 。这告诉我们做类似的事情:重新设计我们的链接,创建html快照,…以使站点可搜索。 我想知道为什么搜寻器不运行javascript来

  • 本文向大家介绍算法题,trim二叉搜索树相关面试题,主要包含被问及算法题,trim二叉搜索树时的应答技巧和注意事项,需要的朋友参考一下 参考回答: C++版本