이 문제는 놀라 울 정도로 사소한 문제입니다. 다음은 Perfect Shuffle (섹션 7)을 통해 Ellis와 Markov, In-Situ, Stable Merging 의 훌륭한 솔루션 입니다. 완벽한 셔플 순열에서주기를 계산하는 Ellis, Krahn 및 Fan 은 더 많은 메모리를 희생하면서 "주기 리더"를 선택하는 데 성공했습니다. 또한 FICH, 먼로와 포블 렛에 의한 좋은 종이이다 관련 치환하는 장소에서 일반 준다 신탁 모델 시간 알고리즘. 순열에 대한 오라클 만 사용 가능한 경우 알고리즘에 로그 공간이 필요합니다. 만약 우리가 역의 오라클을 가지고 있다면, 그것은 일정한 공간을 필요로합니다.O(nlogn)
이제 Ellis와 Markov의 솔루션입니다. 먼저 라고 가정하십시오 . 그런 다음 차수 n 의 완벽한 셔플을 계산하면 차수 x 와 y 의 완벽한 셔플을 계산하는 것으로 줄어 듭니다 . 예를 들어 증명은 다음과 같습니다 ( n = 5 , x = 3 , y = 2 ) :
012 345 67 89 012 567 34 89 051627 3849n=x+ynxyn=5x=3y=2
012345012567051627678934893849
Ellis와 Markov는 일정한 공간과 선형 시간을 사용하여 일 때 완벽한 셔플을 계산하는 쉬운 방법을 찾았 습니다. 이를 사용하여 임의의 n에 대한 완벽한 셔플을 계산하는 알고리즘을 얻습니다 . 우선, 기록 , N = 2 K 0 + ⋯ + 2 K w 의 바이너리 인코딩을 사용하여 N을 하고하자 N 난 = 2 k 개의 I + ⋯ + 2 K w를 . 회전 중간 N 0 비트 우측 셔플 2 케이n=2knn=2k0+⋯+2kwnni=2ki+⋯+2kwn0 비트 오른쪽을 무시2 K 0 비트, 중간 회전N을1 개비트를, 그리고 오른쪽을 셔플2 K 1 비트. 등등. 처음 몇 개의 요소가 회전하면 사이클 리더로 기능하기 때문에 회전이 쉽습니다. 회전의 총 복잡도는O(n은0+⋯+Nw)=O(N), 사람N의 t + 1 <Nt/2. 내부 셔플의 총 복잡도는O(2k02k0n12k1O(n0+⋯+nw)=O(n)nt+1<nt/2 .O(2k0+⋯+2kw)=O(n)
때 완벽한 셔플을 계산하는 방법을 보여줍니다 . 실제로 목걸이 (Fredricksen 및 Maiorana, k 색상 의 비드 목걸이 및 k- ary de Bruijn 시퀀스 , Fredricksen 및 Kessler, 두 가지 색상의 비드 목걸이 생성 알고리즘)에 대한 고전적인 작업에 따라 사이클 리더를 식별 할 수 있습니다 . ).n=2kkk
연결은 무엇입니까? 셔플 순열은 이진 표현의 오른쪽 이동에 해당한다고 주장합니다. 예를 들면 다음과 같습니다. :
000 001 010 011 100 101 110 111 000 100 001 101 010 110 011 111
따라서 사이클 리더를 찾으려면 회전의 각 등가 클래스에서 하나의 대표자를 찾아야합니다. 길이가 k 인 이진 문자열 . 위에서 언급 한 논문은 모든 사이클 리더 를 생성하는 다음 알고리즘을 제공합니다 . 시작 0 Kn=8
000000001100010001011101100010101110110011111111
k0k. 각 단계에서, 우리는 어느 시점에서
입니다. 최대 인덱스 찾기
나 제로 비트 나눗셈의
K를 하여
제가 수득
케이 = D ⋅ 난 + R , 다음과 같은 점하자
( 1 ... A는 I - 1 1 ) 거라고 1 개 ... R을 .
r = 0 일 때마다
새 문자열은 사이클 리더입니다.
a1…akikik=d⋅i+r(a1…ai−11)da1…arr=0
예를 들어, 경우 시퀀스
0000 , 0001 , 0010 , 0011 , 0101 , 0110 , 0111 , 1111이 생성 됩니다.n=16
0000,0001,0010,0011,0101,0110,0111,1111.
사이클 리더가 강조 표시됩니다.