我有一个应用程序需要存储一系列电压数据,每个条目就像一对{时间,电压}
时间不一定是连续的,如果电压不动,我就不会有任何读数。
问题是我还需要一个查找时间戳的函数,比如getVoltageOfTimestamp(float2second(922.325))
我的解决方案是使用存储配对的双端队列,然后每隔30秒,我进行一次采样并将索引存储到地图中 的std ::地图,
所以在getVoltageOfTimestamp(float2second(922.325))中,我只是找到最近的interval_of_30_seconds到所需的时间,然后将deque的指针移动到对应的_index_of_deque,从那里迭代并找到正确的电压。
我不确定这里是否存在更多的“计算机科学家”解决方案,有人能给我一些线索吗?
答案 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秒插入一次数组的索引。现在给出一个时间戳,只需转到第一个数组并找到列表中元素的索引,现在只需去那里检查它之前/之后的几个元素。
希望这有帮助。