arrays - 多峰的一维寻峰算法

标签 arrays algorithm

目前,我指的是 MIT OpenCourseWare 在下面的视频教程中给出的关于在一维数组中查找峰值的解释。

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

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

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

提前致谢!

最佳答案

视频中的问题是:在一维数组 A[0...N-1] 中找到一个峰,其中 A[i] 是一个当 A[i] >= A[i-1] 且 A[i] >= A[i+1]i = 0 且 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)。

关于arrays - 多峰的一维寻峰算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26943750/

相关文章:

c++ - C++初始化二维数组

algorithm - 算法。添加两个n位二进制数。这个问题的循环不变性是什么?

algorithm - 图中两个给定节点之间给定长度的所有路径

c - ARM V7M 64位划分

javascript - 下一个数组元素必须从上一个元素开始

python - Numpy 逐 block 减少操作

algorithm - 我如何直观地解释 S 形神经网络模型?

algorithm - 选择用于合并排序的数组的最小长度 k,其中使用插入排序对子数组进行排序比标准合并排序更优化

ruby-on-rails - 如何将元素添加到逗号分隔的字符串?

jquery - 如何在 NodeJS 中更新 JSON 中的值并过滤以排除值?