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

难以理解峰值查找算法的差异

萧安怡
2023-03-14

这是一个关于一维峰值查找的问题(如果元素比数组中的邻居大,它就是一个峰值)。我正在看麻省理工学院的开放式课程讲座,他谈到了一个天真的解决方案:从索引0开始,一直到最后。

然后他说分而治之的解决方案要好得多。我不明白怎么会这样。这难道不是根据数组的内容做出假设吗?如果只是随机数,那又有什么区别呢?

讲师说他写了一个Python脚本,朴素的解决方案花了13秒,而log(N)解决方案只花了.001秒。我写了一些C#代码,朴素算法在前20个左右的元素中找到一个峰值,运行需要一毫秒的时间。我是不是漏了什么?

以下是本次讲座的PDF摘要:http://ocw.mit.edu/courses/electrice-engineering-and-computer-science/6-006-Introduction-to-algorithms-Fall-2011/lecture-videos/mit6_006F11_LEC01.PDF

共有1个答案

邢昊焜
2023-03-14

与峰有关的是,峰总是存在,要么在中间,要么在左半边,要么在右半边。

假设您发现中间的元素是5,左边的元素是6。那么6是一个峰值吗?否,如果6的左元素是更大的元素,假设7。那么7是一个峰值吗?否,如果7的左元素是更大的元素,假设8。您可以继续这个过程,直到您找到一个峰值或您到达最左边的元素。在后一种情况下,您会得到一个不断增加的数字序列,因此最左边的元素是一个峰值。

所以如果你发现中间的元素比左边的邻居小,那么你肯定知道在左半部寻找一个峰值。你不关心右半部分是否有另一个峰值,不管这个数字的分布是多么随机。如果中间的元素比它的右邻居小,这也是一样的。

就实现的运行时间而言。朴素算法将很快完成,如果它发现一个峰值附近在开始。取一个从11000000的序列进行测试,因为峰值位于最后一个元素。

 类似资料:
  • 给定一个数组[a,b,c,d,e,f,G],其中a-g是数,b是峰当且仅当a<=b且b>=c。 他给出了一个递归的方法: 他说算法是T(n)=T(n/2)+o(1)=o(lgn) 在他的pdf中,他还给出了一个完整的例子: 他的定义是否意味着我们只需要找到一个峰? 我相信这个问题可以看作是在Riverst算法入门书中寻找最大和最小元素。

  • 这周我开始了MIT OCW6.006的讲座,在第一节课上教授介绍了找峰算法。 1 2 3 4 5 6 7 8 9 a-i是数字 位置2是峰当且仅当b≥a且b≥c。如果i≥h,位置9是峰值 他提出这个算法是为了提高它的复杂度: [9,8,7,6,5,2,3,1] 该算法的工作原理如下: 步骤1:A[n/2] 6<7?-->是的,看左半部分[9,8,7,6] 步骤2:A[n/2] 8<9?-->是的,

  • 问题内容: 在React文档中给出以下示例代码: 我做了一些调查,最终得出的结果是: 进而得出。 但是我想知道的是,为什么我不能这样做: 我看不出点差运算符的含义是什么。 问题答案: 这有助于使您的代码更简洁-由于是对象,所以散布运算符会将传入的对象的 属性 应用到组件中。因此,该Component的属性a 的值为,而a 的值为。 它将与以下内容相同: 短一点

  • 问题内容: 我很难理解的确切用法 AFAIK将生成地图文件,每当插入新设备时,它将在以后使用该地图文件,它将与这些地图文件进行匹配,并在匹配时加载模块。 但是我的误解是“模块是否仍在加载?” 我的意思是说我已经加载了。还是我错过了什么? 问题答案: 通常通过加载/插入设备的驱动程序(如果尚未加载)来支持热插拔。 (来自我的回答) 其工作方式如下: 代码中的每个驱动程序都使用以下方式公开其供应商/设

  • 主要内容:插值查找算法的解题思路,插值查找算法的具体实现插值查找算法又称 插值搜索算法,是在 二分查找算法的基础上改进得到的一种查找算法。 插值查找算法只适用于有序序列,换句话说,它只能在升序序列或者降序序列中查找目标元素。作为“改进版”的二分查找算法,当有序序列中的元素呈现均匀分布时,插值查找算法的查找效率要优于二分查找算法;反之,如果有序序列不满足均匀分布的特征,插值查找算法的查找效率不如二分查找算法。 所谓均匀分布,是指序列中各个相邻元素的差值近

  • 我在理解合并排序算法的“合并”部分时有点困难,因为我试图在上下文中理解算法的部分,而某些变量/循环对我来说没有意义。我理解递归除法过程和合并的排序方面,但在这个特定的合并算法中: 我不明白最后3个循环: 你能解释一下这3个循环在合并的上下文中是用来做什么的吗?还有什么进一步的建议可以帮助你更好地理解合并排序算法的合并部分吗?