在阵列中找到2个峰值

时间:2011-02-15 18:26:56

标签: arrays max

我有一个类似

的数组

增加,减少,增加,减少。

我想知道在增加行为结束时两个本地最大元素是什么。我知道我可以在O(n)时间找到它们,我想知道是否有可能在O(log n)时间内找到它或者比O(n)时间更好。

1 个答案:

答案 0 :(得分:2)

如果您不知道您的数据遵循该特定模式 - 增加然后减少然后增加然后减少 - 那么您可以做的最好是O(n),因为您将不得不检查每个项目用于确定两个最高点的数组。

如果你知道肯定确实遵循这种模式,那么我最好的猜测是二进制搜索的改编,大致如下:

  • 选择数据集的中间点,检查'渐变' - 两个连续值之间的差异。
  • 用它将数据分成两半,再次检查两个新空间的中间点;你希望以这种方式继续细分,直到你发现你有足够的数据点,你有一个向下,然后按顺序向上。在这两个点之间是一个低谷,在第一个向下的左边,在最后一个向右的右边,是你正在寻找的高峰。
  • 对这两个空格进行二元搜索以找到实际的峰值 - 再次,每次检查两个值以找到渐变而不是仅采样单个值,这样您就可以知道继续搜索的方向。

如果不做数学运算,我的猜测就是这个算法最好是O(2log(n)),最差的是O(n)。只要搜索整个数据集,你就会非常罕见,而且我认为你需要一个简单的小数据集,比原始搜索需要更长的时间。