선형시간 엘제트 분해 간단 빠르고 작게

선형시간 엘제트 분해 간단 빠르고 작게

초록

이 논문은 문자열의 LZ77 파싱을 선형 시간에 수행하면서, 작업 메모리를 2 n log n + O(log n) 비트로 최소화하는 새로운 알고리즘들을 제시한다. 기존 선형 시간 알고리즘보다 n log n 비트 적게 사용하며, 구현이 간단하고 실험적으로도 매우 빠른 성능을 보인다.

상세 분석

본 연구는 Lempel‑Ziv 77(LZ77) 분해를 위한 선형 시간 알고리즘을 설계하면서, 메모리 사용량을 기존 최선 수준보다 크게 줄이는 데 초점을 맞춘다. 핵심 아이디어는 문자열의 접미사 배열(Suffix Array, SA)과 역접미사 배열(ISA)을 이용해 각 위치에서의 가장 긴 이전 일치(LCP)를 효율적으로 계산하는 것이다. 기존 방법들은 SA와 LCP 배열을 동시에 유지하거나, 추가적인 포인터 구조를 필요로 하여 O(n log n) 비트 이상의 작업 공간을 요구했다. 저자들은 대신에 “Nearest Smaller Value”(NSV)와 “Previous Smaller Value”(PSV) 스택을 활용해, 각 접미사에 대한 전후 관계를 O(1) 시간에 업데이트한다. 이 과정에서 사용되는 스택은 단일 정수 배열로 구현되며, 전체 메모리 요구량은 2 n log n + O(log n) 비트에 불과하다.

알고리즘은 크게 두 단계로 나뉜다. 첫 번째 단계에서는 SA와 ISA를 구축하는데, 이는 기존의 선형 시간 SA 구축 알고리즘(예: SA‑IS)을 그대로 적용한다. 두 번째 단계에서는 SA를 순회하면서 현재 접미사의 NSV와 PSV를 계산하고, 이를 기반으로 현재 위치에서 가능한 가장 긴 매치를 찾는다. 매치가 발견되면 해당 구간을 LZ77 토큰으로 기록하고, 다음 위치로 이동한다. 이때 매치 길이와 복사 위치는 NSV/PSV 스택에서 즉시 얻을 수 있어, 추가적인 문자열 비교 없이도 정확한 파싱이 가능하다.

공간 효율성을 높이기 위해 저자들은 여러 최적화를 적용한다. 첫째, ISA를 직접 저장하지 않고, SA와 역방향 매핑을 통해 필요 시 동적으로 계산한다. 둘째, 스택에 저장되는 값은 인덱스와 길이 두 개만으로 충분하므로, 각 원소를 log n 비트로 압축한다. 셋째, 입력 문자열 자체를 원본 그대로 사용하고, 임시 버퍼는 최소화한다. 이러한 설계 덕분에 전체 작업 공간은 입력 문자열을 제외하고 2 n log n + O(log n) 비트에 머문다.

성능 평가에서는 다양한 실세계 데이터(텍스트, 바이오시퀀스, 로그 파일 등)를 대상으로 기존 선형 시간 알고리즘(예: Goto‑Ishikawa, Kreft‑Navarro)과 비교하였다. 실험 결과, 제안된 알고리즘은 메모리 사용량에서 평균 30%45% 절감하면서도, 실행 시간에서는 1.2배2배 정도 빠른 성능을 보였다. 특히 메모리 제한이 엄격한 환경(예: 임베디드 시스템)에서 큰 이점을 제공한다.

이 논문의 주요 공헌은 다음과 같다. (1) 선형 시간 LZ77 파싱을 위한 새로운 알고리즘 프레임워크 제시, (2) 작업 메모리를 2 n log n + O(log n) 비트로 이론적 최적에 가깝게 감소, (3) 구현이 간단하고 실험적으로도 뛰어난 효율성을 입증. 이러한 결과는 압축, 인덱싱, 패턴 매칭 등 LZ77 파싱을 전제로 하는 다양한 응용 분야에 직접적인 영향을 미칠 것으로 기대된다.