对于数组a: a1, a2, & help;<子> k 子>,白马王子;A n, A k是峰当且仅当A k-1 ≤<> k 通用电气;A k+1当1
分治算法如下:
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]
为什么这个算法是正确的?
这个算法是正确的,尽管它需要一点微积分来证明。第一种情况是微不足道的→高峰。第二种情况是"半峰",意思是它有下降的斜率,但没有上升。
这里有两种可能:
- 函数单调递减,直到中间 →a1≥a2为峰值。
- 函数不单调递减,直到中间 →存在1≥k≥mid,其中ak≥ak-1。让我们选择这个表述成立的最大k & rrr;<子> k + 1 子> & lt;A k≥A k-1 →这是峰值。
类似的论证可以应用于第三种情况,具有相反的"半峰"。