【发布时间】:2018-01-24 14:33:56
【问题描述】:
对于具有单个峰值元素的数组,可以使用二进制搜索在 o(logn) 中完成,但是如果数组中有多个峰值元素,我们应该使用什么方法?
---提供更多信息---- 一个峰值元素是比它的邻居更大的东西,例如,看看下面的数组,
[1,3,20,4,1,0,7,5,2]
里面有2个山峰,20个和7个。
我们需要设计一个算法来找到这个数组中的峰值元素。
【问题讨论】:
-
只按值排序?
-
究竟什么是多峰?最大值,出现多次?需要对数组进行排序以进行二进制搜索。如果已排序,这些峰必须彼此相邻,因此找到它们并不是问题,对吧?
-
@GillesLesire 排序是 O(n log n),线性扫描是 O(n),有序数组的最大元素在最后,所以对于一个有序数组来说,复杂度应该是 O(1)。不知道 O(log n) 是从哪里来的。
-
@f1sh 多个峰值可能意味着系列中的多个值显着高于其他值,但不一定彼此相等。例如,我们在频谱(频率)分析中看到了这种峰值。如果是这种情况,那么如果值的原始索引也没有以某种方式存储,那么排序将无济于事。因为在这种情况下,指标可能比峰值的值更重要。
-
@f1sh 我同意。如果 OP 正在谈论一个相当数学的问题,我猜他是,那么我也不希望在任何地方看到任何二进制搜索算法。他可能首先需要定义什么是“峰值”。它只是一个比其他值更大的值,还是一个比其他值“更大”的值? “更大”是多少?我认为问题的定义还不够好。
标签: java arrays algorithm binary-search