划分并征服用于在阵列中找到峰值的算法。

时间:2013-06-02 21:01:21

标签: algorithm divide-and-conquer

对于数组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]

为什么这个算法是正确的?我认为它可能会失去一个存在峰值的阵列的一半。

1 个答案:

答案 0 :(得分:7)

算法是正确的,虽然它需要一些微积分来证明。 第一种情况是微不足道的→峰值。 第二种情况是“半峰”,意味着它有下坡,但没有上升。

我们有两种可能性:

  • 该函数单调递减,直到 mid →a 1 2 为峰值。
  • 函数不是单调递减直到 mid →存在1≥k≥mid,其中 k ≥a k-1 。让我们选择这个陈述为真的最大k→a k + 1 &lt; a k ≥a k-1 →这就是峰值。

类似的论证可以适用于具有相反“半峰”的第三种情况。