配列内のすべての点のペア間の距離を計算する必要があります。ペアごとに1回しか行いません。私は十分に効率的であるか、よりよい方法がありますか?ここでの例では、私が取得しようとしているかを説明するために視覚と共に、次のとおりC#配列の重複した操作を避ける最も効率的な方法は何ですか?
例えば、第一のセグメントを-B、A-C、-Dを得ます。次にB-C、B-D;そして最後にC-D。言い換えれば、私たちは新しいアレイにA-Bが必要だが、B-Aは複製ではないからだ。これは、ポイントの何千で使用されますので
var pointsArray = new Point[4];
pointsArray[0] = new Point(0, 0);
pointsArray[1] = new Point(10, 0);
pointsArray[2] = new Point(10, 10);
pointsArray[3] = new Point(0, 10);
// using (n * (n-1))/2 to determine array size
int distArraySize = (pointsArray.Length*(pointsArray.Length - 1))/2;
var distanceArray = new double[distArraySize];
int distanceArrayIndex = 0;
// Loop through points and get distances, never using same point pair twice
for (int currentPointIndex = 0; currentPointIndex < pointsArray.Length - 1; currentPointIndex++)
{
for (int otherPointIndex = currentPointIndex + 1;
otherPointIndex < pointsArray.Length;
otherPointIndex++)
{
double xDistance = pointsArray[otherPointIndex].X - pointsArray[currentPointIndex].X;
double yDistance = pointsArray[otherPointIndex].Y - pointsArray[currentPointIndex].Y;
double distance = Math.Sqrt(Math.Pow(xDistance, 2) + Math.Pow(yDistance, 2));
// Add distance to distanceArray
distanceArray[distanceArrayIndex] = distance;
distanceArrayIndex++;
}
}
、私は正確に寸法の配列はIEnumerableをの任意の並べ替えを使用するよりも効率的であると思っています。
これは良いと思われます。効率的で効果的です。代わりにコードレビューでこれを投稿することを意味しましたか? http://codereview.stackexchange.com/ – yamen
@yamen私はそのオプションを知らなかった。私はこの質問をそこに移すことができる方法はありますか?ありがとう! – Stonetip
私の気持ちはこれが最善の方法だということです。すべてのポイントが一意であると仮定すると、論理的には、ポイントのセットからすべての組み合わせを生成する最も良い方法は、セット全体に1回反復し、各反復でそのポイントから残りのアイテムを反復することです。あなたは 'A、B'と' B、A'の組み合わせを決して生成しません。つまり、これはあなたが絶対に*距離を保存する必要があると想定しており、実際にそれらを計算することに頼ることはできません。しかし、それはあなたの質問の範囲外です –