我最近开始看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]
[6,7,4,3,2,1,4,5]
7和5均为峰值。但是,上述算法难道不是仅因为中间元素碰巧满足了第一个分支而才发现7是峰值吗?
因此,如果我们应该找到所有峰,那么我们是否仍要遍历整个阵列?这是否意味着最坏情况N?
他的定义是否意味着我们只需要找到一个峰?
我相信这个问题可以看作是在Riverst的算法简介一书中找到最大和最小元素。
是的,该算法仅找到一个峰。
如果要查找 所有 峰,则必须检查所有元素,因此它将为O(n)。
注意:峰值不一定是全局最大值。