我最近开始看 MIT 的 6.006 课,在第一课中,讲师介绍了寻峰算法。
根据他的定义:
给定一个数组 [a,b,c,d,e,f,g],其中 ag 是数字,b 是一个峰值当且仅当 a <= b 且 b>= c。
他给出了递归的方法:
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 作为峰值吗?
所以如果我们要找到所有的峰,我们还会遍历整个阵列吗?这是否意味着最坏的情况N?
他的定义是否意味着我们只需要找到一个峰值?
我相信这个问题可以看作是在 Riverst 的算法介绍一书中找到最大和最小元素。