专栏文章
简洁的滑动窗口实现
算法·理论参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqv485o
- 此快照首次捕获于
- 2025/12/04 11:14 3 个月前
- 此快照最后确认于
- 2025/12/04 11:14 3 个月前
维护窗口数据缓冲区和单调队列。基于 STL 的简单实现。
实际上,
deque<int>::iterator 的大小可能是 int 的 8 倍,故数据规模较小时,可以考虑在单调队列中存储 int 类型的下标,不清除离开滑动窗口的数据。另一种可能的优化方案是维护一全局偏移量,初始为 0。每当离开滑动窗口的数据足够多时,删除之并相应增加全局偏移量。每当从单调队列中取得下标后,减去全局偏移量再应用于缓冲区即可。
Cclass SlideWindow {
public:
SlideWindow(size_t capacity);
void Push(int value);
int Max() const;
private:
size_t capacity;
deque<int> buffer;
deque<deque<int>::iterator> window; // 严格单调递减队列
};
SlideWindow::SlideWindow(size_t c) : capacity(c) { }
void SlideWindow::Push(int value)
{
auto it = buffer.insert(buffer.end(), value);
if(!window.empty() && size_t(it - window.front()) == capacity) window.pop_front();
while(!window.empty() && *window.back() <= value) window.pop_back();
window.push_back(it);
buffer.erase(buffer.begin(), window.front()); // 最小化空间占用
}
int SlideWindow::Max() const { return *window.front(); }
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...