2015-02-23 110 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转到下一个系列。 (当你到达头节点时需要特别小心,因为那时你需要从系列列表中删除系列)。

您也可以从检查系列的头部开始,以防万一您可以删除整个系列,但这取决于数据的性质以及您期望每个系列中的点的频率。

我希望这能回答你的问题。