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