2015-02-23 38 views
0

我正在繪製N系列數據。每個系列包含N個數據點,這些數據點在UNIX時間中具有5個小數位的精度。數據點可能具有無差別的間隔,因此兩個或多個數據點共享相同的發生時間是非常不可能的。處理過期數據的數據結構/算法

我將所有數據點存儲在一個排序後的集合中。繪製的較小系列由該數據集構建而成。問題是,如果我在時間線上爲數據設置動畫,則一個系列可能沒有任何最近的點,所以這些點不能留在被查看的集合中,因爲它們顯然不在同一個位置。例如,一個數據系列可能會停止點,然後再重新開始。這裏是數據點的數組(它們的UNIX發生時間)。

allpoints = {120.5,130.5,135.5,140.5,140.5,145.5,150.3,150.5,160.5,170.5,180.5,190.5,200.5,200.5};以及其中,

series1 = {135.5,140.5,145.5,150.5,200.5};

series2 = {120.5,130.5,140.5,150.3,160.5, 170.5, 180.5, 190.5,200.5};

當然,我無法保留series1的所有舊點,因爲它基本上不存在50秒,而series 2的點仍然被繪製。

對於我來說,保持這些系列中的數據保持最新狀態的最佳方式是,無需每次從主要數據點集合添加另一個點時都檢查每個點。也許是一個優先隊列或什麼?

感謝

+0

我不明白 - 你想繪製這些舊的數據點或扔掉它們嗎? – MBo 2015-02-23 16:10:34

+0

數據點將被繪製出來,但只有在繪製當前點的合理時間內。 – CanadaIT 2015-02-23 16:13:15

+1

您是否考慮過使用Visiblox FilteredDataSeries for series1和series2,並將其OriginalDataSeries設置爲allpoints? WindowedFilterStrategy可能是你需要的。 http://www.visiblox.com/blog/posts/2013/10/25/plotting-lots-of-data-with-combined-filterstrategies – 2015-02-24 10:09:06

回答

0

如果我理解正確的話,你的問題是,一旦你從主數據集得到一個新的點,你只希望將它添加到現有系列如果時間間隔不大於某一常數越大,間隔到相應系列的最後一點。

所以你的問題基本上是什麼時候可以刪除系列中的老點,以及如何有效地做到這一點。

您可以使用的是一個列表,您可以在其中跟蹤尾部和頭部。然後,一旦你得到一個新的數據點,你可以計算出你想要保留的最老點數的時間。然後循環遍歷每個列表並在計算時間之前刪除帶有時間戳的點。所以你的算法如下:

  1. 新點P來。
  2. 將P添加到相應系列的頭部。
  3. 根據P.time和MAX_INTERVAL計算時間T. (T = P.time - MAX_INTERVAL)
  4. 對於每個活動系列:從尾到環循環。 (讓我們稱您正在查看tempPoint的當前點)。
  5. IF tempPoint.time < T:DELETE並轉到tmpPoint.next。 ELSE轉到下一個系列。 (當你到達頭節點時需要特別小心,因爲那時你需要從系列列表中刪除系列)。

您也可以從檢查系列的頭部開始,以防萬一您可以刪除整個系列,但這取決於數據的性質以及您期望每個系列中的點的頻率。

我希望這能回答你的問題。