숫자 조합 목록을 만들어야합니다. 숫자가 매우 적기 때문에 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});
}
나는 a와 같은 것을 사용하는 것을 고려하고 BitArray
있었지만 어떻게 통합 할 수 있을지 모르겠습니다.
어떤 권장 사항이라도 대단히 감사하겠습니다. 또는 이것이 내가 원하는 일을하는 가장 빠른 방법일까요?
몇 가지 빠른 포인트를 편집 하십시오 (원래 게시물에 넣지 않은 사과).
- 숫자와 그 순서 (2, 3, 4, 3, 4, 3, 3 등)는 매우 중요하므로 LINQ 를 사용하여 순열 생성 과 같은 솔루션을 사용하면 각 '열'의 최대 값이 다음 과 같으므로 도움이되지 않습니다. 다른
- 나는 수학자가 아니므로 '순열'과 '조합'과 같은 기술 용어를 올바르게 사용하지 않으면 사과드립니다. :)
- 나는 않습니다 난 그냥 하나를 잡을 수 없거나 다른 인덱스를 기반으로 - 한 번에 이러한 조합을 모두 채울 필요
- 사용하는
byte
것이 사용 하는 것보다 빠르다는int
것을 보증 합니다. 또한 int보다 67m 이상의 바이트 배열을 갖는 것이 메모리 사용량에 훨씬 좋습니다. - 내 궁극적 인 목표는 중첩 루프에 대한 더 빠른 대안을 찾는 것입니다.
- 병렬 프로그래밍 사용을 고려했지만 달성하려는 반복적 특성으로 인해 성공적으로 수행 할 방법을 찾을 수 없었습니다 (를 사용하더라도
ConcurrentBag
). 그러나 잘못된 것으로 입증되어 기쁩니다. :)
결론
Caramiriel은 루프에서 약간의 시간을 단축하는 좋은 마이크로 최적화를 제공했기 때문에 그 대답을 올바른 것으로 표시했습니다. Eric은 또한 List를 미리 할당하는 것이 더 빠르다고 언급했습니다. 그러나이 단계에서는 중첩 된 루프가 실제로이를 수행 할 수있는 가장 빠른 방법 인 것 같습니다 (우울 해요, 알아요!).
내가 벤치마킹하려고했던 것을 정확히 시도하고 싶다면 StopWatch
각 루프에서 최대 4 개까지 세는 13 개의 루프를 사용하여 목록에서 약 67m + 라인을 만듭니다. 내 컴퓨터 (i5-3320M 2.6GHz)에서 최적화 된 버전을 수행하는 데 약 2.2 초가 걸립니다.