Sayı kombinasyonlarından oluşan bir liste oluşturmam gerekiyor. Rakamlar oldukça küçük olduğundan byte
yerine kullanabilirim int
. Ancak, her olası kombinasyonu elde etmek için birçok iç içe döngü gerektirir. Peşinde olduğum şeyi yapmanın daha verimli bir yolu olup olmadığını merak ediyorum. Şimdiye kadarki kod:
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});
}
A gibi bir şey kullanmayı düşünüyordum BitArray
ama onu nasıl dahil edebileceğimden emin değilim.
Her tavsiye çok makbule geçecektir. Alternatif olarak, belki de istediğimi yapmanın en hızlı yolu budur?
DÜZENLE Birkaç hızlı nokta (ve bunları orijinal gönderiye koymadım özür dilerim):
- Sayıları ve bunların sırası (2, 3, 4, 3, 4, 3, 3 vb.) Çok önemlidir, bu nedenle LINQ kullanarak Permütasyon Oluşturmak gibi bir çözüm kullanmak yardımcı olmaz çünkü her bir 'sütundaki' maksimum farklı
- Matematikçi değilim, bu yüzden 'permütasyonlar' ve 'kombinasyonlar' gibi teknik terimleri doğru kullanmıyorsam özür dilerim :)
- Ben do Sadece bir tanesini kapmak olamaz veya başka bir dizin dayalı - Bir defada bu kombinasyonlardan her doldurmak gerekir
- Kullanmak
byte
, kullanmaktan daha hızlıdırint
, garanti ederim . İnts yerine 67 milyondan fazla bayt dizisine sahip olmak bellek kullanımında çok daha iyidir - Buradaki nihai hedefim, iç içe döngülere daha hızlı bir alternatif aramaktır.
- Paralel programlamayı kullanmayı düşündüm, ancak başarmaya çalıştığım şeyin yinelemeli doğası nedeniyle, bunu başarılı bir şekilde yapmanın bir yolunu bulamadım (ile bile
ConcurrentBag
) - ancak yanlış olduğunu kanıtladığım için mutluyum :)
SONUÇ
Caramiriel, döngüleri bir süre kısaltan iyi bir mikro optimizasyon sağladı, bu yüzden bu yanıtı doğru olarak işaretledim. Eric ayrıca Listeyi önceden tahsis etmenin daha hızlı olduğunu belirtti. Ancak bu aşamada, iç içe geçmiş döngüler aslında bunu yapmanın en hızlı yolu gibi görünüyor (iç karartıcı, biliyorum!).
Karşılaştırmaya çalıştığım şeyi tam olarak denemek istiyorsanız StopWatch
, her döngüde 4'e kadar sayan 13 döngü ile gidin - bu, listede yaklaşık 67 milyon + satır demektir. Makinemde (i5-3320M 2.6GHz) optimize edilmiş sürümü yapmak yaklaşık 2.2 saniye sürer.