在恒定时间内获得最小元素

时间:2016-08-10 19:51:05

标签: c++ arrays algorithm

假设我有一个大小为n的数组A,其中0 <= A [i]&lt; = n。

假设我有2个阵列前进和后退,大小为n,其中:

Forward[i] =  index j where
              A[j] = min(A[i], A[i+1], ..., A[n-1])

Backward[i] = index j where
              A[j] = min(A[i], A[i-1], ..., A[0])

我的问题是:

  • 给出A,前进和后退
  • 给出2个索引 l r

我可以在恒定时间内发现索引k使得A [k] = min(A [1],A [l + 1],...,A [r])吗?

2 个答案:

答案 0 :(得分:3)

不,你不能。一个反例是:

A        = {0, 4, 3, 2, 3, 4, 0}
Forward  = {6, 6, 6, 6, 6, 6, 6}
Backward = {0, 0, 0, 0, 0, 0, 0}
l = 1, k = 5

ForwardBackward在这种情况下无用,您必须搜索O(k-l)的数组。

答案 1 :(得分:3)

没有。至少不在O(1)时间。反例如下。此处使用0-based索引。让

index     = {0, 1, 2, 3, 4, 5, 6, 7, 8}
A         = {1, 3, 5, 7, 9, 6, 4, 2, 0}

Forward   = {8, 8, 8, 8, 8, 8, 8, 8, 8}
Backward  = {0, 0, 0, 0, 0, 0, 0, 0, 8}

现在,如果我要求您获取范围[3, 7]中最小值的索引,您将如何进行?

基本上,在[a,b]

范围内找不到它们
  

如果forward[a] > bbackward[b] < a