【问题标题】:calculating max(min(A[i .. i+d])) in O(n) time O(n) memory在 O(n) 时间 O(n) 内存中计算 max(min(A[i .. i+d]))
【发布时间】:2018-03-04 04:47:37
【问题描述】:

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

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);

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

我脑子里想了这个问题大约 15 天,但还没有装修。 谁能有效地解决这个问题?

输入输出数据:1&lt;n&lt;10^7 1&lt;d&lt;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)

【问题讨论】:

  • 您能说得更具体些吗?也许是输入/输出示例?我不完全理解任务
  • 这被称为“范围最小查询”问题。
  • RMQ 用于随机访问,对于顺序访问有更好的方法:stackoverflow.com/questions/12190184/…
  • this algorithm 具有摊销的 O(n) 运行时间。无论您做什么,请务必在提交作业时引用您的资料来源,这样您就不会犯学术不诚实罪。

标签: c++ algorithm loops max min


【解决方案1】:

遵循Range minimum query 理念(有利于随机访问),我将使用Double-ended queue(有利于顺序访问),它为所有操作提供了 O(1) 的平均复杂度 *.

*插入/删除除外)

【讨论】:

  • 感谢您的回答,您能提供完整的答案吗?
猜你喜欢
  • 2022-01-13
  • 2020-12-11
  • 2015-06-29
  • 2013-11-15
  • 1970-01-01
  • 2018-04-15
  • 2013-08-19
  • 2017-05-17
  • 2014-04-30
相关资源
最近更新 更多