【问题标题】:What is the optimal data structure for storing data points acquired during last n seconds存储在最后 n 秒内获取的数据点的最佳数据结构是什么
【发布时间】:2015-07-20 16:31:59
【问题描述】:

我需要一个数据结构(在 C++ 中)来存储在过去 N 秒内获取的 (integer,double) 对值。整数是相对毫秒的时间戳(保证是单调的),双精度是实际的数据样本。

约束:

  1. 每秒的点数未知,但一旦应用程序启动,预计不会有太大变化。典型值为每秒 10 个点。

  2. 持续时间(即 N 秒)也是先验未知的,并且可以在执行期间更改。但是当它改变时,我可以刷新所有数据并重新开始。典型值为 60 秒。

  3. 在每次迭代中,都会在集合的末尾添加一个新点,并从集合中删除旧点(即比当前时间早 N 秒)。

  4. 我不需要快速随机访问,但需要快速插入(尾部)和删除(头部)。

我现在用的是std::deque,但是感觉尾部加点,头部删除会导致频繁的重新分配。

有没有标准的方法来做到这一点?或者我应该在 std::vector 周围滚动我自己的“循环列表”包装器?

【问题讨论】:

  • 更好地尝试树。或列表。
  • 来自en.cppreference.com/w/cpp/container/deque; “在末尾或开头插入或删除元素 - 摊销常数 O(1)”我认为您不会比这更好。重要的问题是您如何处理这些数据?例如,持续访问重要吗?
  • “我有一种感觉,在尾端加点,从头端删除会导致频繁的重新分配”你有感觉吗? deque 专门用于从末端快速插入和删除。
  • 您的想法应该是在 std::vector 周围有一个“循环列表”包装器,这应该是正确的做法,以避免内存分配/释放(特别是如果您使用 msc)
  • @Syam g++ 使用 512 字节的存储桶,因此每 512 字节您将删除/分配一个存储桶

标签: c++ vector data-structures deque


【解决方案1】:

对于“快速插入(尾部)和删除(头部)”,std::deque 是最佳选择,因为它在两端插入和删除均摊销 O(1)。你也可以使用std::queue。标准库没有提供任何更“高效”的给定要求。

【讨论】:

  • 但是即使点的数量没有增加(因为从头部删除了一个或多个点),当添加一个新点时,双端队列最终是否需要重新分配?
  • @Syam 实现已定义。
  • 关于 msvc 的警告:它有一个可笑的小 _DEQUESIZ 为 16 并且执行类似于 sizeof(T) > 8 的列表
【解决方案2】:

看来你可以使用 boost 中的circular buffer。 C++ STL 中没有等价物。

如果你不想依赖boost,可以自己在std::vector上实现一个不收缩的循环缓冲区,这并不难。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 2011-07-12
    相关资源
    最近更新 更多