分治算法用于查找数组中的峰值



对于数组a: a1, a2, & help;<子> k ,白马王子;A n, A k是峰当且仅当A k-1 ≤<> k 通用电气;A k+1当1 1 &ge时,a1为峰值;A 2,且当A n-1 &le时,A n为峰值;<子> 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]

为什么这个算法是正确的?

这个算法是正确的,尽管它需要一点微积分来证明。第一种情况是微不足道的→高峰。第二种情况是"半峰",意思是它有下降的斜率,但没有上升。

这里有两种可能:

  • 函数单调递减,直到中间 →a1≥a2为峰值。
  • 函数不单调递减,直到中间 →存在1≥k≥mid,其中ak≥ak-1。让我们选择这个表述成立的最大k & rrr;<子> k + 1 & lt;A k≥A k-1 →这是峰值。

类似的论证可以应用于第三种情况,具有相反的"半峰"。

最新更新