2010-01-21 57 views
2

我有一個應用程序,需要存儲一個電壓數據序列,每個條目是類似的一對{時間,電壓}如何存儲時間戳數據的序列?

時間不一定是連續的,如果電壓不動,我不會有任何閱讀。

的問題是,我還需要有查找時間戳,等,getVoltageOfTimestamp(float2second(922.325))

我的解決辦法是有存儲所述paires,然後每30秒的雙端隊列功能,我做了取樣和索引存儲到地圖 的std ::地圖,

所以裏面getVoltageOfTimestamp(float2second(922.325)),我只是找到最近interval_of_30_seconds到所需的時間,然後我的雙端隊列的指針移動到那對應的_index_of_deque,從那裏迭代並找到正確的電壓。

我不確定在這裏是否有更多'計算機科學家'的解決方案,任何人都可以給我一個線索?

+0

知道你需要在記憶中存儲多少個參數以便能夠給出很好的答案會很有趣。 – 2010-01-21 08:29:52

+0

男人如何參賽?典型的時間分辨率是多少?數據中是否有大的「漏洞」?二進制搜索對你來說太慢了嗎? – 2010-01-21 08:35:39

回答

1

您可以在您的std::deque上使用二進制搜索,因爲時間戳按升序排列。

如果你想優化速度,你也可以使用std::map<Timestamp, Voltage>。要查找元素,可以在地圖上使用upper_bound,並返回upper_bound找到的元素之前的元素。這種方法使用更多的內存(因爲std::map<Timestamp, Voltage>有一些開銷,它也分別分配每個條目)。

1

而不是使用單獨的地圖,您可以直接在雙層查找來查找最近的時間戳。考慮到std :: map的複雜性要求,執行二進制搜索將與地圖查找一樣有效(都是O(log N)),並且不需要額外的開銷。

+0

是的,但調整一個'std :: vector'是很昂貴的。 'std :: deque'使用多個內存塊,不需要重新分配和複製resize中的每個值。 – hjhill 2010-01-21 08:26:07

+0

@hjhill - 好點,我要刪除矢量建議。 – 2010-01-21 08:35:20

0

你介意使用C++ ox conepts嗎?如果不是deque<tuple<Time, Voltage>>將完成這項工作。

0

您可以改進二進制搜索的一種方法是識別數據的樣本。假設你的樣本是每30毫秒,然後在矢量/列表中存儲讀數,當你得到它們。在另一個數組中,每30秒插入一次數組的索引。現在給定一個時間戳,只需進入第一個數組並找到列表中元素的索引,現在就去那裏檢查它之前/之後的幾個元素。

希望這會有所幫助。

相關問題