对于数组a:a 1 , 2 ,... a k ,... a n , a k 是一个峰值当且仅当 k-1 ≤a k ≥a k + 1 时1&lt; k和k < ñ。如果 1 ≥a 2 , 1 是一个峰值,如果, n 是一个峰值> n-1 ≤a n 。目标是从阵列中找到一个峰值。
分而治之算法如下:
find_peak(a,low,high):
mid = (low+high)/2
if a[mid-1] <= a[mid] >= a[mid+1] return mid // this is a peak;
if a[mid] < a[mid-1]
return find_peak(a,low,mid-1) // a peak must exist in A[low..mid-1]
if a[mid] < a[mid+1]
return find_peak(a,mid+1,high) // a peak must exist in A[mid+1..high]
为什么这个算法是正确的?我认为它可能会失去一个存在峰值的阵列的一半。
答案 0 :(得分:7)
算法是正确的,虽然它需要一些微积分来证明。 第一种情况是微不足道的→峰值。 第二种情况是“半峰”,意味着它有下坡,但没有上升。
我们有两种可能性:
类似的论证可以适用于具有相反“半峰”的第三种情况。