0

我最初有一个结构来在 C# 中存储 x、y 和时间坐标,例如

  struct handCoordinate {
         internal double x; 
         internal double y; 
         internal double time; 
  }

并计划使用队列来存储这些数据。我需要计算该数据的平均速度并将下一项与上一项进行比较。使用队列来比较每个 handCoordinate 项目然后使用列表是否有意义?这是一个例子:

 handCoordinate(4.0, 0.01, 1.3)
 handCoordinate(-3.0, 0.02, 1.8)

换句话说,什么数据结构最适合访问这些元素?谢谢!(如果需要,我可以澄清更多)

4

1 回答 1

0

SortedList比Queue更有意义,因为您将对其进行迭代以计算平均值。使用队列,您只能保证项目以与推送时相同的顺序弹出。使用时间作为键的排序列表将保持项目按时间顺序排列,而不管它们是按什么顺序插入的。排序列表也不需要您删除项目以使用它们,如果需要其他计算而不需要额外的数据结构,则可以更轻松地重用这些项目。

public struct HandCoordinate
{
     public HandCoordinate(double x, double y, double time)
     {
         this.X = x;
         this.Y = y;
         this.Time= time;
     }

     public readonly double X;
     public readonly double Y;
     public readonly double Time;
}

...

private static double Velocity(HandCoordinate p1, HandCoordinate p2)
{
     var time = p2.Time - p1.Time;
     if (time <= 0)
     {
         throw new ArgumentException("Duplicate measurement");
     }

     var dx = p2.X - p1.X;
     var dy = p2.Y - p1.Y;
     var distance = Math.Sqrt(dx*dx + dy*dy);

     // note the possibility for overflow if your times are very close together.
     // You might need to use logarithms for the calculation.
     return distance/time; 
}

...

var points = new SortedList<double,HandCoordinate>();
points.Add(1.0, new HandCoordinate(1.0, 1.0, 1.0));
points.Add(1.1, new HandCoordinate(1.0, 2.0, 1.1));
..

var velocities = points.Values
                       .Skip(1)
                       // note: because of the skip i in the following is the offset
                       // from the second element and can be used directly to refer
                       // to the previous element
                       .Select((p,i) => Velocity(points.Values[i],p))
                       .ToList();
于 2013-03-10T20:52:02.060 回答