首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于这种RMQ,最快的算法是什么?

对于这种RMQ,最快的算法是什么?
EN

Stack Overflow用户
提问于 2017-09-29 06:47:37
回答 1查看 318关注 0票数 0

我正在使用以下算法(伪代码)执行任务

代码语言:javascript
复制
int A = []
int C = { ... } // N non-negative integers 
int R = { ... } // N non-negative integers
for(i = 0 to N){
    // Let j in range [i-R[i], i-1]
    A[i] = Minimum of ( A[j] + C[j] ) where j in [i-R[i], i-1]
}

循环要做的是,使用以前计算过的A[j]范围来计算当前的A[i]

对我来说,这就像做N个动态RMQ(范围最小查询)。

它是动态的,因为我们事先不知道A的值,我们使用以前计算的值在线计算它。

例如,

代码语言:javascript
复制
C = {10,1,5,3}
R = {2,4,2,3}

A[0] = C[0] // Assume for i = 0, this is always true as base case
A[1] = Min(A[j] + C[j]) where -3 <= j <= 0, only j = 0 is valid option
     = Min(A[0] + C[0]) = 20
A[2] = Min(A[j] + C[j]) where 1 <= j <= 1
     = 21
A[3] = Min(A[j] + C[j]) where -1 <= j <= 2
     = Min(A[0]+C[0], A[1]+C[1], A[2]+C[2])
     = Min(20, 21, 24)
     = 20

所以我的问题是,有没有比O(N^2)更快的算法来实现这一点?我觉得有一些方法/数据结构可以加速N RMQ,但我不知道如何实现。

如果例子不清楚,请告诉我详细说明。

EN

回答 1

Stack Overflow用户

发布于 2017-09-29 10:21:27

动态RMQ问题是段树的一个基本应用,每个查询的复杂度为O(log n)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46483221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档