DC3 (Skew)
1mod 3 분류
길이 n인 문자열의 위치를 mod 3으로 세 그룹으로 나눈다.
- Bi = { j : j mod 3 = i } (0 ≤ i ≤ 2)
B12 = B1 ∪ B2, |B12| ≤ ⌈2n/3⌉.
2B12 정렬
각 B12 위치 i에서 시작하는 삼중자 ti = (Si, Si+1, Si+2)를 기수 정렬로 정렬한다. 삼중자가 모두 고유하면 B12의 순서가 확정된다.
중복이 있으면 각 삼중자에 순위(이름)를 부여해 새 문자열 r12를 만들고, r12에 대해 DC3를 재귀 호출한다.
- r12의 앞 n1개: B1 위치 삼중자 t1, t4, t7, ⋯ 의 rank
- r12의 뒤 n2개: B2 위치 삼중자 t2, t5, t8, ⋯ 의 rank
|r12| ≤ ⌈2n/3⌉이므로 T(n) = T(2n/3) + O(n) → T(n) = O(n). 재귀 결과로 B12 전체의 정렬 순서와 각 위치의 rank가 확정된다.
3B0 정렬
i ∈ B0이면 i+1 ∈ B1이므로 rank(i+1)은 B12 정렬에서 이미 알고 있다. 따라서 B0 위치는 (Si, rank(i+1)) 쌍으로 기수 정렬할 수 있다.
4병합
정렬된 B0와 B12를 병합한다. B0 위치 a와 B12 위치 p의 비교는 O(1)이다.
p ∈ B1: a+1 ∈ B1, p+1 ∈ B2. 둘 다 B12이므로 rank를 안다.
suf(a) < suf(p) ⇔ (Sa, rank(a+1)) < (Sp, rank(p+1))
p ∈ B2: a+2 ∈ B2, p+2 ∈ B1. 둘 다 B12이므로 rank를 안다.
suf(a) < suf(p) ⇔ (Sa, Sa+1, rank(a+2)) < (Sp, Sp+1, rank(p+2))
비교가 O(1)이므로 병합 전체가 O(n).
5참고 문헌
- Kärkkäinen, J., Sanders, P., & Burkhardt, S. (2006). Linear work suffix array construction. Journal of the ACM, 53(6), 918–936.