一尘不染

寻峰算法

algorithm

我最近开始看MIT的6.006讲座,在第一堂课中,讲师介绍了峰值查找算法。

http://ocw.mit.edu/courses/electrical-engineering-and-computer-
science/6-006-introduction-to-algorithms-fall-2011/lecture-
videos/MIT6_006F11_lec01.pdf

根据他的定义:

给定数组[a,b,c,d,e,f,g],其中ag是数字,当且仅当a <= b并且b> = c时,b才是峰值。

他给出了一种递归方法:

if a[n/2] < a[n/2 -1] then look for a peak from a[1] ... a[n/2 -1]
else if a[n/2] < a[n/2+1] then look for a peak from a[n/2+1] ... a[n]
else a[n/2] is a peak

他说算法是T(n)= T(n / 2)+ o(1)= o(lgn)

他在pdf中还给出了一个完整的示例: [6,7,4,3,2,1,4,5]

7和5均为峰值。但是,上述算法难道不是仅因为中间元素碰巧满足了第一个分支而才发现7是峰值吗?

  1. 因此,如果我们应该找到所有峰,那么我们是否仍要遍历整个阵列?这是否意味着最坏情况N?

  2. 他的定义是否意味着我们只需要找到一个峰?

我相信这个问题可以看作是在Riverst的算法简介一书中找到最大和最小元素。


阅读 361

收藏
2020-07-28

共1个答案

一尘不染

是的,该算法仅找到一个峰。

如果要查找 所有 峰,则必须检查所有元素,因此它将为O(n)。

注意:峰值不一定是全局最大值。

2020-07-28