주기가 매우 적은 경우 공간을 덜 사용하지만 종료하는 데 시간이 훨씬 더 오래 걸리는 알고리즘이 있습니다.
[편집] 내 이전 런타임 분석은 우리가 방문한 노드가 이전에 샘플링 된 노드 중 하나인지 여부를 결정하는 데 중요한 비용을 놓쳤습니다. 이 답변은 이것을 수정하기 위해 약간 수정되었습니다.
우리는 다시 S의 모든 요소를 반복합니다 . 우리는 요소의 궤도 탐험 의 ∈ S를 , 우리는 우리가 다시 건너 여부를 확인 할 수 있도록하기 위해, 우리가 방문한 것을 노드에서 샘플. 우리는 또한 이전에 방문했던 공통 주기로 끝나는 (따라서주기와 등가 인) 궤도의 결합 인 '구성 요소'의 샘플 목록을 유지합니다.
빈 컴포넌트 목록을 초기화하십시오 complist
. 각 구성 요소는 해당 구성 요소의 샘플 모음으로 표시됩니다. 또한 samples
일부 구성 요소 또는 다른 구성 요소의 샘플로 선택된 모든 요소를 저장 하는 검색 트리 를 유지 관리합니다 . G 를 n 까지의 정수 시퀀스라고 하자 . 부울 술어를 계산하여 멤버쉽을 효율적으로 판별 할 수 있습니다. 예를 들어, 2의 거듭 제곱 또는 일부 정수 p에 대해 완벽한 p 번째 거듭 제곱 . 각각 의 ∈ S , 다음을 수행하십시오
- s 가에 있으면
samples
5 단계로 건너 뜁니다.
- 빈 목록
cursample
, 반복자 j ← f ( s ) 및 카운터 t ← 1을 초기화합니다 .
- 반면 j는 하지 않을
samples
:
- 만약 t ∈ G , 삽입 J 모두에 cursample
와 samples
.
— t를 증가 시키고 j ← f (j)를 설정 합니다.
- j 가에 있는지 확인하십시오
cursample
. 그렇지 않은 경우 이전에 살펴본 구성 요소를 발견했습니다. 구성 요소 j가 속한 구성 요소를 확인 하고 모든 요소를 cursample
적절한 요소에 삽입하여 기능 complist
을 보강하십시오. 우리는 삽입 : 그렇지 않으면, 우리는 우리가 적어도 한 번 이전에 발견 된 사이클의 대표자가 발생하지 않고주기를 통과 한 것을 의미 현재의 궤도에서 요소를 다시 발생했습니다 cursample
, 새로 발견 구성 요소에서 샘플의 모음으로,에 complist
.
- 다음 요소로 진행 S ∈ S .
들어 N = | S |, X (n)을 예상 사이클 수 ( 예 : X (n) = n 1/3 )를 설명하는 모노톤 증가 함수로 하고 Y (n) = y (n) log ( n ) ∈ Ω ( X (n) log ( n ))은 메모리 사용량의 목표를 결정하는 모노톤 증가 함수입니다 ( 예 : y (n) = n 1/2 ). 각 성분에서 하나의 샘플을 저장하려면 최소한 X (n) log ( n ) 공간이 필요하므로 y (n) ∈ Ω ( X (n) )이 필요합니다 .
우리가 샘플링하는 궤도의 요소가 많을수록 궤도 끝의주기에서 샘플을 신속하게 선택하여 해당주기를 빠르게 감지 할 가능성이 높습니다. 점근 적 관점에서 볼 때, 메모리 한계가 허용하는 한 많은 샘플을 얻는 것이 합리적입니다. G 보다 n 보다 작은 예상 y (n) 요소 를 갖도록 G 를 설정할 수도 있습니다 . — S 에서 궤도의 최대 길이 가 L 일 것으로 예상되면 , G 를 L / y (n) 의 정수 배로 할 수 있습니다 . — 예상 길이가 없으면 n / y (n) 마다 한 번만 샘플링하면
집단; 이것은 어쨌든 샘플 사이의 간격의 상한입니다.
새 구성 요소를 찾을 때 이전에 방문한 S의 요소를 탐색하기 시작하면 (새 구성 요소가 발견되었거나 이전의 터미널주기가 이미 발견 된 구성 요소) 최대 n / y ( n) 이전에 샘플링 된 요소를 만나는 반복; 이것은 새로운 구성 요소를 찾으려고 시도 할 때마다 중복 노드를 순회합니다. 우리가 만드는 때문에 N 등의 시도를, 우리는 중복 요소 방문 S를 대부분에서 N 2 / Y (n)의 총 시간.
멤버십을 테스트하는 데 필요한 작업 samples
은 O ( y (n) log y (n) )이며, 방문 할 때마다 반복됩니다.이 검사의 누적 비용은 O ( n 2 log y (n )입니다. 또한, 각각의 수집 물에 샘플을 추가하는 비용도 있으며, 이는 누적 적으로 O ( y (n) log y (n) )입니다. 마지막으로, 이전에 발견 된 구성 요소를 다시 만날 때마다 우리는 어떤 구성 요소를 재발견했는지 결정하기 위해 최대 X (n) log * y (n) 시간을 소비해야합니다 . 이 작업은 최대 n 번 발생할 수 있으므로 누적 작업은 n X (n) log y (n)으로 제한 됩니다.
따라서 우리가 방문하는 노드가 샘플 중 하나인지 여부를 확인하기 위해 수행 된 누적 작업은 런타임을 지배합니다.이 비용은 O ( n 2 log y (n) )입니다. 그런 다음 y (n) 을 가능한 작게 만들어야 합니다. 즉, O ( X (n) )입니다.
따라서, 하나의 O ((그주기에있는 최종 요소의 수와 동일 함)의 사이클 수를 열거 할 수 X (n)은 로그 ( N ))의 공간, O 복용 ( N 2 로그 X (N) ) 여기서 X (n) 은 예상 사이클 수입니다.