在O(n)时间O(n)存储器中计算max(min(A [i ... i + d]))

时间:2017-09-22 14:49:36

标签: c++ algorithm loops max min

我有一个算法问题,要求在max(min(A[i .. i+d]))时间内获得O (n) 一般解决方案:

int max = 0;
for( i = 0; i< n-d; i++){
  int min = MX;
  for( j = i; j < i + d; j++)
     if(min > A[j])
       min = A[j];
  if(max < min)
     max = min;
}
printf("%d\n", max);

但它需要O(n x d)而不是O(n)

更好的解决方案:使用Range_minimum_query

int max = 0;
for( i = 0; i< n-d; i++){
  int min = RMQ( i , i + d);
  if(max < min)
     max = min;
}
printf("%d\n", max);

RMQ的平均时间为O(log(d) * n)需要log(d)

我认为这个问题在我的头脑中大约15天,但还没有装修。 任何人都能有效地解决这个问题吗?

i / o数据:1<n<10^7 1<d<n

input : n = 10, d = 3, A[i] > 0
1, 3, 2, 4, 5, 6, 7, 8, 9, 10
result : 8 //= max(1, 2, 2, 4, 5, 6, 7, 8)

1 个答案:

答案 0 :(得分:1)

遵循Range minimum query哲学(适合随机访问),我会使用Double-ended queue(这对于顺序访问很有用),它为所有人提供了平均复杂度O(1)操作 *

* 除了插入/删除)