2011-03-21 3 views
1

Mathematica 5.2를 사용하여 많은 수의 순열을 생성합니다. 5.2

In[1]:=Tuples[{0,1},3] 

Out[1]={{0,0,0},{0,0,1},{0,1,0},{0,1,1},{1,0,0},{1,0,1},{1,1,0},{1,1,1}} 

하지만 20 개 이상의 장소에서 0과 1을 배치하여 모든 가능한 순열을 생성 할 때 문제가있다가, 튜플 명령을 출력하기 때문에 제공하지 : 나는 같은 순열을 생성하는 명령 튜플을 사용 기억력 부족. 예를 들어, I 출력을 제공하지 않습니다,

Tuples[{0,1},25] 

명령 "튜플을"0과 1 등을 이용하여 순열의 많은 수를 생성 할 경우, 그것은 생성 할 충분한 메모리 공간이 없다는 메시지를 제공합니다 이렇게 많은 수의 순열을 처리하면 어떻게이 문제를 해결할 수 있습니까? 더 큰 순열을 생성하는 다른 프로세스가 있습니까? 또는 출력물 [1]과 같은 배열에서 동시에 생성하는 대신 순열을 하나씩 생성하려면 어떻게해야합니까?

답변

5

단일 평가에서 이러한 순열 목록을 생성하려면 3GB 이상의 메모리가 필요합니다. 여기 티카 (8)에 생성되는 출력이다 :

In[1]:= NumberForm[ ByteCount [ Tuples[{0, 1}, 25] ], DigitBlock -> 3] 
Out[1]//NumberForm= 3,355,443,368 

티카 5.2 커널 32 비트 실행하고 메모리 요구량을 처리 할 수있다. 당신은 한 번에 하나의 순열을 생산하는 대신 Do 루프를 사용할 수 있습니다

With[{n = 4}, Do[Print[IntegerDigits[i, 2, n]], {i, 0, 2^n - 1}]] 
+0

감사합니다 ... –

2

를 특정 예에서, {0,1}Tuples, 그것은 정수로 결과를 저장하는 것이 훨씬 더 효율적입니다.

Range[0, 2^25 - 1] // ByteCount 
0 : 길이 25의 튜플의

a = Tuples[{0, 1}, 20]; 
b = Range[0, 2^20 - 1]; 

ByteCount /@ {a, b} 
{83886168, 4194388}
Length /@ {a, b} 
{1048576, 1048576}
a[[618021]] == IntegerDigits[ b[[618021]] , 2, 20] 
True

메모리 사용

1

특별히 "출력 (output) [1]과 같이 배열에서 동시에 생성하는 대신 순열을 하나씩 생성하려면 어떻게해야합니까?"

Mathematica 5.2는 NextPermutation 용 Combinatorica Add-on 패키지를 사용했습니다.

In[1]:= <<"DiscreteMath`Combinatorica`" 

In[2]:= somepermutation={0,1,2}; NextPermutation[somepermutation] 

Out[3]= {0,2,1} 

In[4]:= NextPermutation[%] 

Out[4]= {1,0,2} 

In[5]:= NextPermutation[%] 

Out[5]= {1,2,0} 

등. 그러나 NextPermutation 만 올바르게 다중 세트가 아닌 조합을 설정합니다. 아래의 책은 이것을 설명하고 해결 방법이 있습니다.

In[6]:= somepermutation={0,1,0};NextPermutation[somepermutation] 

Out[7]= {0,0,1} 

In[8]:= NextPermutation[%] 

Out[8]= {0,1,0} 

당신이 필수적이다 당신 옆에 다음 Pemmaraju 및 Skiena에 의해 "전산 이산 수학, 조합론과 티카와 그래프 이론"의 사본을 가지고 티카에 Combinatorica을 사용하려는 경우. 그 부분은 참조로 사용하기에 더 잘 쓸 수 있지만 Combinatorica를 사용하는 것이 훨씬 어려울 것입니다.

관련 문제