Ich muss eine Liste von Zahlenkombinationen erstellen. Die Zahlen sind ziemlich klein, so dass ich byte
eher als verwenden kann int
. Es sind jedoch viele verschachtelte Schleifen erforderlich, um jede mögliche Kombination zu erhalten. Ich frage mich, ob es eine effizientere Möglichkeit gibt, das zu tun, wonach ich suche. Code ist bisher:
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});
}
Ich habe überlegt, so etwas wie ein zu verwenden BitArray
, bin mir aber nicht sicher, wie ich es integrieren könnte.
Alle Empfehlungen wäre sehr dankbar. Alternativ ist dies vielleicht der schnellste Weg, um das zu tun, was ich will?
BEARBEITEN Einige kurze Punkte (und Entschuldigung, ich habe diese nicht in den ursprünglichen Beitrag aufgenommen):
- Die Zahlen und deren Reihenfolge (2, 3, 4, 3, 4, 3, 3 usw.) sind sehr wichtig. Daher hilft die Verwendung einer Lösung wie dem Generieren von Permutationen mit LINQ nicht, da die Maxima in jeder 'Spalte' sind anders
- Ich bin kein Mathematiker, also entschuldige ich mich, wenn ich die Fachbegriffe wie "Permutationen" und "Kombinationen" nicht richtig verwende :)
- Ich tun müssen alle diese Kombinationen füllen auf einmal - ich kann nicht nur eine greifen oder eine andere basiert auf einem Index
- Die Verwendung
byte
ist schneller als die Verwendungint
, das garantiere ich . Bei der Speichernutzung ist es auch viel besser, mehr als 67 Millionen Bytes als Ints zu haben - Mein oberstes Ziel ist es, nach einer schnelleren Alternative zu verschachtelten Schleifen zu suchen.
- Ich habe überlegt, parallel zu programmieren, aber aufgrund der iterativen Natur dessen, was ich erreichen möchte, konnte ich keinen Weg finden, dies erfolgreich zu tun (auch nicht mit
ConcurrentBag
) - aber ich bin froh, dass ich mich als falsch erwiesen habe :)
FAZIT
Caramiriel hat eine gute Mikrooptimierung bereitgestellt, die einige Zeit in den Schleifen spart, daher habe ich diese Antwort als richtig markiert. Eric erwähnte auch, dass es schneller ist, die Liste vorab zuzuweisen. Aber zu diesem Zeitpunkt scheinen die verschachtelten Schleifen tatsächlich der schnellstmögliche Weg zu sein (deprimierend, ich weiß!).
Wenn Sie genau das ausprobieren möchten StopWatch
, womit ich ein Benchmarking durchgeführt habe , verwenden Sie 13 Schleifen, die bis zu 4 in jeder Schleife zählen - das ergibt ungefähr 67 m + Zeilen in der Liste. Auf meinem Computer (i5-3320M 2.6GHz) dauert die optimierte Version ca. 2.2s.