数字の組み合わせのリストを作成する必要があります。数が非常に少ないので、byte
ではなく使用できますint
。ただし、考えられるすべての組み合わせを取得するには、多くのネストされたループが必要です。私が求めていることを行うためのより効率的な方法があるかどうか疑問に思っています。これまでのコードは次のとおりです。
var data = new List<byte[]>();
for (byte a = 0; a < 2; a++)
for (byte b = 0; b < 3; b++)
for (byte c = 0; c < 4; c++)
for (byte d = 0; d < 3; d++)
for (byte e = 0; e < 4; e++)
for (byte f = 0; f < 3; f++)
for (byte g = 0; g < 3; g++)
for (byte h = 0; h < 4; h++)
for (byte i = 0; i < 2; i++)
for (byte j = 0; j < 4; j++)
for (byte k = 0; k < 4; k++)
for (byte l = 0; l < 3; l++)
for (byte m = 0; m < 4; m++)
{
data.Add(new [] {a, b, c, d, e, f, g, h, i, j, k, l, m});
}
のようなものを使うことを考えていましたBitArray
が、どうやって組み込むのかわかりません。
任意の推奨事項をいただければ幸いです。あるいは、おそらくこれが私がやりたいことをする最も速い方法ですか?
いくつか の簡単なポイントを編集します(そして私がこれらを元の投稿に入れなかったことをお詫びします):
- それらの数と順序(2、3、4、3、4、3、3など)は非常に重要であるため、LINQを使用した順列の生成などのソリューションを使用しても、各「列」の最大値は異なる
- 私は数学者ではないので、「順列」や「組み合わせ」などの専門用語を正しく使用していない場合はお詫びします:)
- 私はない、私はちょうど1をつかむことができないか、別のインデックスに基づいて-一度にこれらの組み合わせの全てを移入する必要があります
- 使用
byte
は使用よりも速いですint
、私はそれを保証します。また、メモリ使用量については、intではなく67m以上のバイト配列を使用する方がはるかに優れています。 - ここでの私の最終的な目標は、ネストされたループのより高速な代替手段を探すことです。
- 並列プログラミングの使用を検討しましたが、達成しようとしていることの反復性のため、(を使用しても
ConcurrentBag
)それを成功させる方法を見つけることができませんでした-しかし、間違っていることが証明されてうれしいです:)
結論
Caramirielは、ループから少し時間を短縮する優れたマイクロ最適化を提供しているので、その答えを正解としてマークしました。エリックはまた、リストを事前に割り当てる方が速いと述べました。しかし、この段階では、ネストされたループが実際にこれを行うための可能な限り最速の方法であるように思われます(気のめいるように、私は知っています!)。
私がベンチマークしようとしていたことを正確に試したい場合はStopWatch
、各ループで最大4つまでカウントする13のループを使用してください。これにより、リストに約67m以上の行が作成されます。私のマシン(i5-3320M 2.6GHz)では、最適化されたバージョンを実行するのに約2.2秒かかります。