【问题标题】:Searching an array with monotonic sequences of values搜索具有单调值序列的数组
【发布时间】:2015-07-04 11:09:15
【问题描述】:

我有一个大数组,其中值在长子序列中单调上下(没有关系)(这样的序列可以是任意数量和任意大的大小,当然还有 > 2 个项)。

小规模示例:

1 2 3 4 5 9 7 4 3 -2 -5 -7 3 5 34 56 67 78 89 90 8 6 2 -4 -5 ...

等等。

我有兴趣找到任何(只是1,不是全部)结束递增序列的值以及新递减序列开始的位置。

最好的方法是什么?复杂性是多少?

(我的直觉认为这可能类似于二进制搜索,所以我猜测 O(logN),但不确定这是否正确)

【问题讨论】:

  • 单调上升是指严格上升还是可以像1、3、3、5一样重复输入?另外,您为什么明确提到这些子序列是“长的”?您是否有任何启发式方法来了解它们中的每一个发生多长时间的频率?否则这不会有任何区别。在一般情况下,我认为你无法避免线性运行时间来解决这个问题。
  • 是的,严格递增或递减,而且通常很长(例如,几十万个词,当然超过 2 个词,没有关系)。

标签: arrays search sequence binary-search


【解决方案1】:

你不能在这里应用二分搜索,因为给定的序列没有排序。 您可以在 o(n) 中通过搜索下一个元素小于该元素的第一个元素来执行此操作。 就像上面的例子 9 将是答案

【讨论】:

  • 我的想法是如下进行。从中间开始。如果局部增加我扔掉左侧。如果局部减少,我扔掉右侧。每次从剩余部分的中间重复一次,直到我应该快速收敛到“断点”。如果我没记错的话,这应该是对数的(如果我错了,请告诉我)......
  • 我认为你的算法只有在序列以递增序列开始并以递减序列结束时才会起作用。例如对于像 7,8,6,5,2,3,4,5 这样的序列,6,7,8,9,10,11 你的算法会给出答案 11 但答案应该是 8。
  • 我同意尼基尔。我想根据序列的交替方式,可能需要进行一些调整。 (如果搜索本地最小值,可能需要进行类似的调整。)
  • @Pam:你的算法行不通。考虑序列1, 2, 1, 2, 3, 4, 5, 6, 7, 8,9 你将从 4 开始。它在局部增加,你扔掉左边,但你不会在右边找到正确的结果,因为它都在增加。正确的做法是在索引 1 处返回 2(从 0 开始计数)。如果你把两边倒过来扔掉继续,我只是把例子转过来,把峰放在最后。
  • 当然要求每个序列在任何时候至少有2个term,否则无法确定“局部单调性”。我是含蓄地假设的。显然,如果您有单个值,我们甚至不能谈论“子序列”,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-11
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2018-10-07
  • 1970-01-01
  • 2019-07-10
相关资源
最近更新 更多