적절한 순열을 적용하는 복잡성


27

놀랍게도, 이것에 관한 논문을 찾을 수 없었습니다. 아마도 잘못된 키워드를 검색했을 것입니다.

그래서, 우리는 어떤 배열을 가지고 있고 인덱스에 함수 를 가지고 있습니다. 는 순열입니다.ff

메모리와 런타임이 가능한 및 가까운 에 따라 배열을 어떻게 재정렬 합니까?fO(1)O(n)

이 작업이 쉬워 질 때 추가 조건이 있습니까? 예를 함수 명시 적으로 알면 는 의 역함수입니다 .gf

사이클을 따라 가고 각 인덱스의 사이클을 통과하여 사이클이 가장 적은지 확인하는 알고리즘에 대해 알고 있지만 평균적으로 더 나은 동작 인 것처럼 보이지만 최악의 경우 런타임이 있습니다. ...O(n2)


쉬운 관찰 : 항목의 배열뿐만 아니라 함수 f를 포함하는 배열도 쓰기 가능하면 O (1) 정수 레지스터를 사용하여 O (n) 시간에 작업을 수행하는 것이 쉽습니다 (각각 길이 O ( log n) bits) 및 각 사이클을 따라 한 항목에 대한 추가 공간. 그러나 함수 f가 읽기 전용 스토리지에 제공되거나 (또는 ​​f가 오라클로만 제공되는 경우) 작동하지 않습니다.이 질문의 가정이라고 생각합니다.
이토 쓰요시

23
Fich et al. 1995 : 시간, 공간 또한 특별한 경우에 대해서도 설명합니다. O(nlogn)O(logn)
Jukka Suomela

예, 나는 우리가 오라클로 f를 가지고 있다고 가정합니다.
jkff 2016 년

3
@ JukaSuomela, 당신은 대답으로 만들어야합니다. 또한 가 임의의 순열 임을 고려 하면 간단한 엔트로피 인수는 공간 및 / 또는 시간을 생성하므로 시간 공간 에서 보다 더 잘 수행 할 수 있다면 놀랍습니다. . fO(nlogn)O(nlogn)
user834

답변:


4

옵션 0 : Permuting In Place (1995), Faith E. Fich, J. Ian Munro, Patricio V. Poblete 시간 공간.O(nlogn)O(log2n)

옵션 1 : 순열을 간결한 데이터 구조로 압축하여 치트를 제거하십시오 (Munro http://www.itu.dk/people/ssrao/icalp03-a.pdf 참조) .

옵션 2 : 프라임 사이클 분해를 사용하여 파마를 간결하게 저장하고 여분의 공간을 사용하여 부정 행위 http://oeis.org/A186202

옵션 3 : 조작 된 각 사이클의 가장 큰 인덱스를 추적하십시오. 각 반복마다 보이지 않는 가장 큰 색인을 사용하여주기의 모든 항목을 하나씩 이동하십시오. 보이는 인덱스에 도달하면 사이클이 이미 조작되었으므로 모든 작업을 취소하십시오. 시간, 공간.O(n2)O(#cycleslogn)

옵션 4 : 조작 된 각 사이클의 가장 큰 인덱스를 추적하되 고유 한 사이클 길이의 배치로만 수행하십시오. 각 반복마다 보이지 않는 가장 큰 색인을 사용하여주기의 모든 항목을 하나씩 이동하십시오. 보이는 인덱스에 도달하면 해당 사이클이 이미 조작되었으므로 모든 작업을 취소하십시오. 시간, 공백.O(n2distinct_cycle_lengths)O((#cycles_with_same_size)logn)

옵션 5 : 옵션 0과 동일한 용지에서 Munro의 가 해당 사이클에서 가장 큰 인덱스 인 경우 의 사이클을 회전합니다 . 시간 및 공간i=1..np(i)iO(n2)O(logn)


압축 방법은 일반적으로 공간을 절약하지 못할 수 있습니다. 순열을 저장하는 최악의 경우 공간은 입니다. 3, 4, 5는 OP가 이미 알고있는 솔루션이나 Fich, Munro 및 Poblete의 솔루션만큼 일반적으로 나빠 보입니다. 그리고 그 해결책은 이미 @Jukka에 의해 지적되었습니다nlogn
Sasho Nikolov

# 5는 로그 (n) 팩터에 의해 # 0보다 적은 공간을 사용합니다.
Chad Brewbaker

1

순열의주기 표시를 사용하는 경우 현재 순열되는 항목을 저장하기 위해 1 개의 추가 배열 요소가 필요하며 더 나쁜 O (N) 연산에서주기를 실행할 수 있습니다.


2
jkff는 이미 사이클 추종 알고리즘을 알고 있으므로 순열 자체가 블랙 박스로 (가까운) 처리되도록 분명히하고 싶습니다. 질문에서 지적한 것처럼 (거의) 블랙 박스에서 사이클 표현으로 변환하는 데 O (n ^ 2) 시간이 걸릴 수 있습니다.
Joshua Grochow

블랙 박스 p (i)는 괜찮습니다. 당신이 i로 돌아올 때까지 당신은 단지주기를 돌아갑니다. 이 문제는 업데이트 된 항목 목록을 저장하기 위해 Kolomogorov의 복잡성 중 하나로 여러 번 순환하지 않습니다. 먼로는 그것에 한계가있다. itu.dk/people/ssrao/icalp03-a.pdf
Chad Brewbaker

-2

N 개 항목의 순열은 N-1 이하의 교환을 사용하여 다른 순열로 변환 될 수 있습니다. 이 방법의 최악의 경우 오라클 (F ())에 대한 O (n ^ 2) 호출이 필요할 수 있습니다. 가장 작은 위치에서 시작하십시오. x를 현재 교환하고있는 위치로하자.

F (x)> = x이면 위치 x와 F (x)를 교체합니다. 그렇지 않으면 F (x) 위치에 있던 항목이 현재 목록에서 어디에 있는지 찾아야합니다. 우리는 다음 반복으로 이것을 할 수 있습니다. y = F (x)라고하자. y> = x : y = F (y) : 끝까지 수행하십시오. 이제 위치 x와 y를 교환하십시오.


3
OP는 이미 시간 안에 그것을하는 방법을 알고 있다고 말했다 . O(n2)
Jukka Suomela

죄송합니다. 나는이 그룹에 처음이다. 나는이 방법이 단순하기 때문에 좋아합니다. 때로는 효율성보다 단순함이 더 빠릅니다. O (n) 단계가 필요하지만 O (nlogn) 공간이 필요한 다른 방법을 알고 있습니다.
Russell Easterly

1
Russell, 심지어 O (n log n) 공간을 할당하고 영점 조정하는 것은 이미 O (n log n)입니다. 다른 방향을 의미 했습니까?
jkff

실제로 할당 공간이 없으며 공간이 없습니다. 기본 아이디어는 F (x)> x 일 때 항목을 x 위치에 놓은 위치를 기억해야합니다. 정말 큰 n의 경우 데이터베이스를 사용하고 항목 x가 이동 한 위치를 기록합니다. x가 최종 위치에 도달하면 레코드를 삭제할 수 있습니다.
Russell Easterly

1
그렇다면 왜 O (n log n) 공간이 필요하다고 말합니까?
jkff

-2

이 방법은 F의 역수를 사용하며 n 비트의 저장 공간이 필요합니다. x가 원래 배열에서 항목의 위치이면 G (x)를 정렬 된 배열에서 항목의 위치로 둡니다. B를 n 비트 배열로 설정하십시오. B의 모든 n 비트를 0으로 설정하십시오.

x = 1 ~ n-1의 경우 : IF B (x) == 0 그때 : y = G (x) : 끝날 때까지 x == y : 위치 x와 y를 교체 : B (y) = 1 : y = G ( y) : 루프 : ENDIF : 다음 X

이 방법은 현재 위치 x에있는 항목을 항목의 최종 위치로 계속 교체합니다. 올바른 항목이 x 위치로 바뀌면 내부 루프가 종료됩니다. 각 스왑은 하나 이상의 항목을 항목의 최종 위치로 이동하기 때문에 실행 중에 내부 Do 루프를 n-1 번 이상 실행할 수 없습니다. 이 방법은 O (n) 시간과 공간이라고 생각합니다.


2
신문을 보셨습니까? 여기에 나열된 두 알고리즘은 "명백한"두 알고리즘입니다. 이 논문은 다른 시공간 트레이드 오프, 특히 훨씬 적은 시공간 트레이드를 갖는 덜 명백한 논문을 가지고있다.
Yuval Filmus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.