说我有一个清单:
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时间做得更好?
答案 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数据结构上使用二进制搜索。