리니어 타임 인플레 이스 리플 셔플 알고리즘


15

리니어 타임 인플레 이스 리플 셔플 알고리즘이 있습니까? 이것은 특히 거대 손이 수행 할 수있는 알고리즘입니다. 균등 한 크기의 입력 배열을 균등하게 나누고 두 반쪽의 요소를 인터리빙합니다.

Mathworld에는 리플 셔플 에 대한 간단한 페이지가 있습니다. 특히, 입력 배열 1 2 3 4 5 6을 1 4 2 5 3 6으로 변환하는 셔플 아웃 다양성에 관심이 있습니다. 정의에서 입력 길이는 입니다.2

크기 이상의 보조 배열이 있으면 선형 시간으로이 작업을 수행하는 것이 간단합니다. 먼저 마지막 요소를 배열에 복사하십시오 . 그런 다음 0 기반 색인화를 가정하면 첫 번째 요소를 색인 에서 복사하십시오 . 그런 다음 요소를 두 번째 배열에서 입력 배열로 다시 복사하여 인덱스 을 매핑 합니다. 입력의 첫 번째 요소와 마지막 요소는 움직이지 않기 때문에 그보다 약간 적은 작업을 수행 할 수 있습니다.n n [ 0 , 1 , 2 , . . , n - 1 ][0,1,2,...,n1][0,2,4,...,2n2]n[0,1,2,...,n1][1,3,5,...,2n1]

이를 적절하게 수행하는 한 가지 방법은 순열을 분리 된 사이클로 분해 한 다음 각 사이클에 따라 요소를 재배 열하는 것입니다. 다시 0부터 시작하는 인덱싱을 가정 할 때, 6 가지 요소 사례에 관련된 순열은

σ=(012345024135)=(0)(5)(1243).

예상 한대로 첫 번째 요소와 마지막 요소는 고정 된 점이며 중간 4 개 요소를 순열하면 예상 결과를 얻습니다.

불행히도 순열 수학 (및 이자형엑스 ) 에 대한 나의 이해 는 대부분 위키 백과를 기반으로하며 이것이 선형 시간으로 이루어질 수 있는지 모르겠습니다. 이 셔플 링과 관련된 순열은 빠르게 분해 될 수 있습니까? 또한 완전한 분해가 필요하지 않습니다. 각 분리 된 사이클의 단일 요소를 결정하는 것만으로도 충분할 것입니다. 요소 중 하나에서주기를 재구성 할 수 있기 때문입니다. 완전히 다른 접근법이 필요할 수 있습니다.

관련 수학에 대한 유용한 자료는 알고리즘만큼이나 가치가 있습니다. 감사!


가 시간 용액 (함께 외부 공간). 나는 선형 시간 솔루션을 모른다. 영형(lg)영형(1)
Radu GRIGore

4
cs.stackexchange에 더 적합합니다. 비 균일 모델에서는 시간이 항상 가능합니다. 이 경우 균일하게도 가능해야합니다. 영형()
Yuval Filmus

1
@Radu 이 질문 과 마찬가지로이 문제에는 여분의 공간 만 사용하고 여분의 공간을 사용하는 솔루션은 없을 것입니다 . 영형(1)영형(로그)
타이슨 윌리엄

2
나는 나의 의견을 받아들이고 닫는다. (물론이 질문에 대한 답변이 있습니다.)
Yuval Filmus

1
지난 주 CS 학생으로부터이 질문을 들었으며, 면접에서 들었습니다.
Jeffε

답변:


12

이 문제는 놀라 울 정도로 사소한 문제입니다. 다음은 Perfect Shuffle (섹션 7)을 통해 Ellis와 Markov, In-Situ, Stable Merging 의 훌륭한 솔루션 입니다. 완벽한 셔플 순열에서주기를 계산하는 Ellis, Krahn 및 Fan 은 더 많은 메모리를 희생하면서 "주기 리더"를 선택하는 데 성공했습니다. 또한 FICH, 먼로와 포블 렛에 의한 좋은 종이이다 관련 치환하는 장소에서 일반 준다 신탁 모델 시간 알고리즘. 순열에 대한 오라클 만 사용 가능한 경우 알고리즘에 로그 공간이 필요합니다. 만약 우리가 역의 오라클을 가지고 있다면, 그것은 일정한 공간을 필요로합니다.O(nlogn)

이제 Ellis와 Markov의 솔루션입니다. 먼저 라고 가정하십시오 . 그런 다음 차수 n 의 완벽한 셔플을 계산하면 차수 xy 의 완벽한 셔플을 계산하는 것으로 줄어 듭니다 . 예를 들어 증명은 다음과 같습니다 ( n = 5 , x = 3 , y = 2 ) : 012 345 67 89 012 567 34 89 051627 3849n=x+ynxyn=5x=3y=2

012345678901256734890516273849

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

000001010011100101110111000100001101010110011111
k0k. 각 단계에서, 우리는 어느 시점에서 입니다. 최대 인덱스 찾기 제로 비트 나눗셈의 K를 하여 제가 수득 케이 = D + R , 다음과 같은 점하자 ( 1 ... A는 I - 1 1 ) 거라고 1 개 ... R을 . r = 0 일 때마다 문자열은 사이클 리더입니다.a1akikik=di+r(a1ai11)da1arr=0

예를 들어, 경우 시퀀스 0000 , 0001 , 0010 , 0011 , 0101 , 0110 , 0111 , 1111이 생성 됩니다.n=16

0000,0001,0010,0011,0101,0110,0111,1111.

사이클 리더가 강조 표시됩니다.


3
2323k30,,3k

비록 Jain의 논문이 조금 더 간단하다고 생각하지만, 가장 많은 표를 얻은 이전 게시물뿐만 아니라 이전 논문을 선호합니다.
Johny

6

이것은 cs.stackexchange.com의 시드 질문이며 대답은 다음과 같습니다. /cs/332/in-place-algorithm-for-interleaving-an-array/400#400

이 문서에 대한 설명은 http://arxiv.org/abs/0805.1598 입니다.

케이2케이2케이=2

그 대답은 순열 다룬다는 점에 유의하십시오.제이2제이모드2+1


하아! 나는 완전히 내가 토론에 참여하더라도, 그 질문에 대해 잊어 버렸습니다. 이것은 그 시간이 어떻게 작동하는지 실제로 이해하지 못했음을 의미합니다.
Radu GRIGore

2

미디엄=미디엄2나는에프(나는)=2나는나는/2에프(나는)=2(나는모드/2)1나는>/2

영형(1)영형(로그)


아 잠깐만 이는 리플 순열의 모든 값이 동일한주기에 있다고 가정합니다. 이 전략은 몇 개의 분리 된 사이클이 있는지에 따라 약간 수정되어야합니다.
Robert Robere
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.