2

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

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

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

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

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

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

4

4 回答 4

1

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

于 2010-01-21T08:21:27.457 回答
1

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

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

于 2010-01-21T08:33:34.360 回答
0

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

于 2010-01-21T08:40:26.113 回答
0

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

希望这可以帮助。

于 2010-01-26T05:46:40.263 回答