Joe가 링크 한 논문에서 알고리즘을 자세히 설명하는 답변은 다음과 같습니다. http://arxiv.org/abs/0805.1598
먼저 나누기와 정복을 사용 하는 Θ ( n 로그n ) 알고리즘을 살펴 보겠습니다 .
1) 나누고 정복
우리는 주어진다
에이1,2, … , b1, b2, … b엔
이제 나누기와 정복을 사용하기 위해 m = Θ ( n ) 에 대해 배열을 얻으려고합니다.
[ a1,2, ... ,엠, b1, b2, … , b엠] , [ am + 1, ... ,엔, bm + 1, … b엔]
그리고 재귀.
일부의 알 비1, b2, … b엠,m + 1, ...엔
의 순환 시프트이다
에이m + 1, ...엔, b1, … b엠
에 의해 엠 장소.
이것은 고전적이며 세 번의 반전과 O ( n ) 시간 내에 제자리에서 수행 할 수 있습니다 .
따라서 나누기와 정복은 T ( n ) = 2 T ( n / 2 ) + Θ ( n ) 과 유사한 재귀 로 Θ ( n 로그n ) 알고리즘을 제공합니다 .티( n ) = 2 T(n/2)+Θ(n)
2) 순열주기
이제 문제에 대한 또 다른 접근 방식은 순열을 일련의 분리 된 주기로 간주하는 것입니다.
순열은 다음과 같이 주어집니다 ( 1 에서 시작한다고 가정 ).
j ↦ 2 j모드2 N + 1
일정한 여분의 공간을 사용하여 사이클이 무엇인지 정확히 알고 있다면 요소 에이 를 선택하여 순열을 실현하고 해당 요소가 어디로 갔는지 (위의 공식을 사용하여) 결정하고 대상 위치의 요소를 임시 공간에 넣고 요소 에이 를 해당 대상 위치에 놓고 사이클을 따라 계속합니다. 한 사이클을 마치면 다음 사이클의 요소로 이동하여 해당 사이클을 따릅니다.
이것은 우리에게 O ( n ) 시간 알고리즘을 제공 할 것이지만, 우리가 어떻게 "정확한 사이클이 무엇인지 알았다"고 가정하고 O ( 1 ) 공간 제한 내에서 이러한 부기를 유지하려고 시도하는 것이이 문제를 어렵게 만듭니다.
종이가 숫자 이론을 사용하는 곳입니다.
이 경우에는, 그 표시 할 수있는 경우에 2 N + 1 = 3케이 , 위치의 요소를 1 , 3 , 32, … , 3k - 1 다른 사이클에있는 모든 사이클은 위치 요소를 포함 삼엠, m ≥ 0 .
이 사실 사용하는 2 의 발생기이다 ( Z / 3케이)※ .
따라서 2 N + 1 = 3케이 일 때, 사이클 접근 방식에 따라 각 사이클에 대해 O ( n ) 시간 알고리즘이 제공됩니다. 우리는 정확히 시작 위치를 알고 있습니다 : 삼 거듭 제곱 ( 1 포함 ) O ( 1 ) 공간).
3) 최종 알고리즘
이제 우리는 나누기와 정복 + 순열주기 두 가지를 결합합니다.
우리는 나눗셈을 정복하고 있지만, 선택 엠 되도록 2 m + 1 의 힘 삼 및 m = Θ ( n ) .
따라서 두 "반쪽"에서 되풀이되는 경우 하나만 반복하고 Θ ( n ) 추가 작업을 수행합니다.
이것은 우리에게 재발 제공 티( n ) = T( C의 N ) + Θ ( N ) (일부 0 < c < 1 ), 따라서 우리에게 제공 O ( n ) 시간, O ( 1 ) 공간 알고리즘!