0

私はもともと、x、y、および時間座標をC#のように格納する構造体を持っています

  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 に答える