如何存储一系列带时间戳的数据?

时间:2010-01-21 07:59:28

标签: c++ data-structures deque

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

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

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

我的解决方案是使用存储配对的双端队列,然后每隔30秒,我进行一次采样并将索引存储到地图中 的std ::地图,

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

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可以改进二进制搜索的一种方法是识别数据样本。假设您的样本是每30毫秒,那么在vector / list中存储读数。在另一个数组中,每30秒插入一次数组的索引。现在给出一个时间戳,只需转到第一个数组并找到列表中元素的索引,现在只需去那里检查它之前/之后的几个元素。

希望这有帮助。