【问题标题】:datastructure to maintain time window of values?数据结构来维护值的时间窗口?
【发布时间】:2014-10-18 14:18:00
【问题描述】:

我正在解决一个需要保持十秒时间窗口的问题。随着新点的到来,它们会添加到队列的末尾,并且随着时间的推移,超过十秒的点会离开队列的前面。队列可以变得非常大,比如 1000 个或更多元素。

有趣的部分是我还需要快速访问中间的元素,比如比 3 秒前更早的第一个元素。快速做到这一点是困难的部分。

请注意,队列始终是排序的。

我考虑过排序数组,但是从前面删除元素很慢。列表搜索速度很慢。

我是用 c++ 做的,但欢迎使用任何语言。

【问题讨论】:

  • 简单的std::set 有什么问题?您需要多快?
  • 积分是否及时统一到达?
  • std::deque + 二分搜索可能值得考虑。如果您对必须支持的查询给出更精确的定义,这可能会有所帮助。
  • 使用比您在任何给定时间需要存储的最大点数大两到三倍的数组。保留“前”和“后”指针;当“后退”指针想要越过数组的末尾时,将所有内容移动到数组的开头。

标签: c++ algorithm data-structures


【解决方案1】:

我正在解决一个需要保持十秒时间窗口的问题。随着新点的到来,它们会添加到队列的末尾,并且随着时间的推移,超过十秒的点会离开队列的前面。队列可以变得非常大,比如 1000 个或更多元素。

1000 个元素看起来并不大,所以我看不出有什么问题。实际的时间要求会更有用。

请注意,队列始终是排序的。

按什么排序?时间?由于时间似乎是索引本身,并且它是一个 FIFO,所以这似乎是定义的情况。

我考虑过排序数组,但从前面删除元素很慢。

为什么需要额外排序?它有多慢,需要多快?你正在使用什么实现?如果您知道点数的上限,为什么不直接使用循环缓冲区?

列表搜索速度很慢。

您使用什么搜索方法?它的实现是什么样的?它有多慢?它需要多快?是否事先知道搜索的性质可以帮助加快搜索速度?二分查找不够快吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 2020-08-07
    • 2014-10-09
    • 1970-01-01
    相关资源
    最近更新 更多