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仍在绘制中。

对我来说,让这些系列中的数据保持最新的最佳方式是什么,而不必在每次从主要数据点集合中添加另一个点时检查每个点?也许是优先队列之类的?

谢谢

4

1 回答 1

0

如果我理解正确,您的问题是,一旦您从主数据集中获得一个新点,您只想将其添加到现有系列中,如果时间间隔不大于某个常数,即到相应系列中最后一个点的间隔。

所以你的问题本质上是,你什么时候可以从系列中删除旧点,以及如何有效地删除。

您可以使用一个列表,您可以在其中跟踪尾部和头部。然后,一旦你得到一个新的数据点,你就会计算你想要保留的最旧点的时间。然后循环遍历每个列表并删除计算时间之前带有时间戳的点。所以你的算法如下:

  1. 新的P点来了。
  2. 将 P 添加到其各自系列的开头。
  3. 根据 P.time 和 MAX_INTERVAL 计算时间 T。(T = P.time - MAX_INTERVAL)
  4. 对于每个活动系列:从尾到头循环。(我们称您正在查看的当前点为 tempPoint)。
  5. 如果 tempPoint.time < T:删除并转到 tmpPoint.next。否则转到下一个系列。(当您到达头节点时需要特别小心,因为您需要从系列列表中删除该系列)。

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

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

于 2015-02-23T17:41:00.880 回答