【发布时间】:2017-08-07 03:14:41
【问题描述】:
我目前有以下数据结构:
class DataStructure {
public:
DataStructure(int n) : m_data(n, 0) {
}
void update(int i, int j, int value) {
for (int k = i; k <= j; ++k) {
m_data[k] = max(m_data[k], value);
}
}
void reset(int i) {
m_data[i] = 0;
}
int query(int i) {
return m_data[i];
}
private:
vector<int> m_data;
};
所以它的作用相当简单:
- 最初有一个由 n 个整数组成的向量,初始化为零。
- update(i, j, value) 将 [i, j] 范围内的元素更新为给定值及其各自当前值的最大值。给定的值在 [0, n] 的范围内。
- reset(i) 将索引 i 处的值重置为 0。
- query(i) 返回索引 i 处的值。
我需要执行 n 次更新、n 次重置和 n 次查询操作。目前此代码需要 O(n*n) 时间,因为更新操作通常是 O(n)。
我想知道是否有一些聪明的方法可以将 n 次更新、n 次重置和 n 次查询操作的时间改进为 O(n*log n) 时间(或更好),同时保持 O(n) 空间复杂度?
【问题讨论】:
-
第2点不清楚,是否会在{A[L]...A[R]}中将[L,R]中的所有值都更新到最大值?
-
@marvel308 读取代码中的更新函数......似乎应该在单个元素的基础上完成
-
您需要在线算法还是提前知道所有查询?
-
我认为这可以通过分段树以及惰性传播数据结构来完成
-
如果您像 DAle 那样事先不知道所有查询,那么在最坏的情况下,您实际上需要执行 n² 次更新——在这种情况下,您的更新以
update(0, n-1, 1), update(0, n-1, 2), update(0, n-1, 3), ..., update(0, n-1, n)给出。所以不可能在小于 O(n²) 的时间内完成。
标签: algorithm data-structures language-agnostic