Мені потрібно створити список комбінацій чисел. Цифри досить малі, тому я можу 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 , не допоможе, оскільки максимуми в кожному "стовпці" дорівнюють інший
- Я не математик, тому перепрошую, якщо я неправильно використовую такі технічні терміни, як "перестановки" та "комбінації" :)
- Я дійсно потрібно заповнити всі ці комбінації відразу - я не можу просто взяти один або інший на основі індексу
- Використання
byte
швидше, ніж використанняint
, я гарантую це. Також набагато краще при використанні пам'яті мати 67 м + масиви байтів, а не ints - Моєю кінцевою метою тут є пошук швидшої альтернативи вкладеним циклам.
- Я розглядав можливість використання паралельного програмування, але через ітеративний характер того, що я намагаюся досягти, я не зміг знайти спосіб зробити це успішно (навіть з
ConcurrentBag
), проте я радий, що мені довели, що я помиляюся :)
ВИСНОВОК
Caramiriel забезпечила хорошу мікрооптимізацію, яка збриває певний час із циклів, тому я позначив цю відповідь як правильну. Ерік також зазначив, що швидше попередньо розподілити Список. Але на цьому етапі здається, що вкладені цикли насправді є найшвидшим можливим способом зробити це (гнітюче, я знаю!).
Якщо ви хочете спробувати саме те, що я намагався порівняти StopWatch
, використовуйте 13 петель, відлічуючи до 4 у кожному циклі - це складає близько 67 м + рядків у списку. На моїй машині (i5-3320M 2,6 ГГц) для оптимізованої версії потрібно близько 2,2 с.