【问题标题】:1-D Peak Finding Algorithm for Multiple Peaks多峰的一维峰寻找算法
【发布时间】:2014-11-15 17:24:18
【问题描述】:

目前,我指的是在麻省理工学院 OpenCourseWare 的以下视频教程中找到一维数组中的峰值的解释。

https://www.youtube.com/watch?v=HtSuA80QTyo

递归关系:T(n)=T(n/2) + O(1) 只强调数组的一半加上它会导致一个峰值作为输出。如果说确实存在多个峰值,那么递归关系可能是什么。

请有人解释一下这个查询。

提前致谢!

【问题讨论】:

  • @user2190060 不错的视频,但只看了一半就几乎睡着了...如果您想扩展算法以检测所有峰值而不仅仅是一个,那么您必须使用不同的算法所以你不能使用单峰算法的递归。顺便说一句,用于检测所有峰值我认为没有比 O(n) 更好的解决方案,除非知道有关输入数据的更多信息(例如最小峰值距离 ...)

标签: arrays algorithm


【解决方案1】:

视频中的问题是:在一维数组A[0...N-1] 中找到一个峰值,其中A[i]A[i] >= A[i-1] and A[i] >= A[i+1]i = 0 and A[i] >= A[i+1]i = N-1 and A[i] >= A[i-1] 时的峰值。一个数组可能有很多峰,注意你只需要给出任何一个。这个问题可以通过分而治之的算法来解决。我在C 中实现了它。

// it return the index of the peak.
//it can contain many peak, you can return Any One.

int find_a_peak(int a[], int low, int hi) {
   if (low == hi) return low;
   if (low == hi - 1) return a[low] > a[hi] ? low : hi;
   int mid = (low + hi) / 2;
   if (a[mid] >= a[mid+1]) {
     //At least one peak can be found in the subarray A[low,low+1,...,mid]
     return find_a_peak(a, low, mid);
   } else {
     //At least one peak can be found in the subarray A[mid+1,...,hi]
     return find_a_peak(a, mid+1, hi); 
   } 
}

其实这个算法和二分查找是一样的。您可以在每一步将阵列切割一半。即T(N) = T(N/2) + O(1),即T(N) = O(lnN)。

【讨论】:

    猜你喜欢
    • 2013-09-26
    • 2010-12-15
    • 2017-02-09
    • 2015-02-10
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    相关资源
    最近更新 更多