【发布时间】:2014-10-18 14:18:00
【问题描述】:
我正在解决一个需要保持十秒时间窗口的问题。随着新点的到来,它们会添加到队列的末尾,并且随着时间的推移,超过十秒的点会离开队列的前面。队列可以变得非常大,比如 1000 个或更多元素。
有趣的部分是我还需要快速访问中间的元素,比如比 3 秒前更早的第一个元素。快速做到这一点是困难的部分。
请注意,队列始终是排序的。
我考虑过排序数组,但是从前面删除元素很慢。列表搜索速度很慢。
我是用 c++ 做的,但欢迎使用任何语言。
【问题讨论】:
-
简单的
std::set有什么问题?您需要多快? -
积分是否及时统一到达?
-
std::deque + 二分搜索可能值得考虑。如果您对必须支持的查询给出更精确的定义,这可能会有所帮助。
-
使用比您在任何给定时间需要存储的最大点数大两到三倍的数组。保留“前”和“后”指针;当“后退”指针想要越过数组的末尾时,将所有内容移动到数组的开头。
标签: c++ algorithm data-structures