【问题标题】:How to store a sequence of timestamped data?如何存储带时间戳的数据序列?
【发布时间】:2011-01-07 15:20:17
【问题描述】:

我有一个需要存储一系列电压数据的应用程序,每个条目类似于一对{时间,电压}

时间不一定是连续的,如果电压不动,我就不会有读数了。

问题是我还需要一个查找时间戳的函数,例如 getVoltageOfTimestamp(float2second(922.325))

我的解决方案是有一个存储对的双端队列,然后每 30 秒,我进行一次采样并将索引存储到地图中 标准::地图,

所以在 getVoltageOfTimestamp(float2second(922.325)) 中,我只需找到距离所需时间最近的 interval_of_30_seconds,然后将我的 deque 指针移动到对应的_index_of_deque,从那里迭代并找到正确的电压。

我不确定这里是否存在更“计算机科学家”的解决方案,谁能给我一个线索?

【问题讨论】:

  • 想知道你必须在内存中存储多少个文门才能给出一个好的答案。
  • man 条目如何?典型的时间分辨率是多少?数据中是否存在大的“漏洞”?二分搜索对你来说太慢了吗?

标签: c++ data-structures deque


【解决方案1】:

您可以在 std::deque 上使用二进制搜索,因为时间戳是按升序排列的。

如果您想优化速度,您也可以使用std::map<Timestamp, Voltage>。要查找元素,您可以在地图上使用upper_bound 并返回upper_bound 找到的元素之前的元素。这种方法使用更多内存(因为std::map<Timestamp, Voltage> 有一些开销,并且它还单独分配每个条目)。

【讨论】:

    【解决方案2】:

    而不是使用单独的映射,您可以直接在双端队列上进行二进制搜索以找到壁橱时间戳。考虑到 std::map 的复杂性要求,进行二分搜索将与地图查找一样高效(两者都是 O(log N)),并且不需要额外的开销。

    【讨论】:

    • 是的,但是调整std::vector 的大小很昂贵。 std::deque 使用不止一块内存,并且不需要在调整大小时重新分配和复制每个值。
    • @hjhill - 好点,我要放弃向量推荐。
    【解决方案3】:

    你介意使用 c++ ox conepts 吗?如果不是 deque<tuple<Time, Voltage>> 将完成这项工作。

    【讨论】:

      【解决方案4】:

      一种优于二分搜索的改进方法是识别数据样本。假设你的样本是每 30 毫秒,然后在向量/列表中存储你得到的读数。在另一个数组中,每 30 秒插入一次数组的索引。现在给定一个时间戳,只需转到第一个数组并找到列表中元素的索引,现在只需到那里检查之前/之后的几个元素。

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-03
        • 2015-10-13
        • 2015-05-06
        • 2017-02-02
        • 1970-01-01
        • 2018-07-19
        相关资源
        最近更新 更多