用于在列表中查找所有可能子范围的最小值的算法

时间:2012-03-12 23:55:58

标签: algorithm

说我有一个清单:

L = [2,5,1,8,3,7,9,4,6,10] 或类似的东西

我希望能够创建一个描述所有可能范围的最小值的二维列表/数组/等(例如,最小值[0] [3]表示查看元素0到3时的最小值)。

例如:

Range(0 through 3) = minimum is 1
Range(5 through 5) = minimum is 7
Range(3 through 8) = minimum is 3

依此类推,适用于所有可能的范围。有没有办法比n ^ 2时间做得更好?

3 个答案:

答案 0 :(得分:0)

我认为在不到n ^ 2的时间内将这种类型的算法强加于计算是不可能的。这可能是因为您开始使用一系列随机列表。即使你逐项放置物品,最低限度的发现也会略低(也许)。然而,这也需要时间。可能降低时间的唯一方法是订购清单,但我们必须考虑摊销时间。

答案 1 :(得分:0)

为它构建一个分段树。查询时间为O(logn)。 http://en.wikipedia.org/wiki/Segment_tree

答案 2 :(得分:0)

如果您正在尝试http://projecteuler.net/problem=375(我认为您不是) 那你的问题可能是一个XY问题: http://www.perlmonks.org/?node_id=542341

我建议的解决方案(我不知道它是否快速,甚至是准确的)是:

given your list L, create some more lists L1, L2, .. etc
now for a given i, define L1[i] = j
(where j is the minimum j>i such that L[j] < L[i]

现在我建议你可以在O(N)中创建L1 现在说你想要min(范围(a,b)),answer = L[L1[..L1[a]]](我想?..保持嵌套,直到你得到j&gt; b并且你已经过了b,然后回去一个)

现在为了加快速度,让L2成为与L1类似的数据结构,但L2一次跳过两个。 L3一次跳过4次,L4每次跳过8次。

现在,您可以在不同的L数据结构上使用二进制搜索。