处理过期数据的数据结构/算法

时间:2015-02-23 15:41:59

标签: c# wpf algorithm data-structures visiblox

我正在绘制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的点仍在绘制中

对于我来说,最好的方法是保持这些系列中的数据是最新的,而不必每次从主数据点集合中添加另一个点时都检查每个点?可能是优先级队列还是什么?

由于

1 个答案:

答案 0 :(得分: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转到下一个系列。 (当你到达头节点时需要特别小心,因为那时你需要从系列列表中删除该系列)。
  6. 您也可以先查看系列文章,以防您删除整个系列,但这取决于您的数据的性质以及您对每个系列中各点的预期频率。

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