인듀스 정렬로 LCP 배열을 한 번에 만들기
본 논문은 기존의 선형 시간 인듀스 정렬 기반 suffix array 구축 알고리즘을 확장하여, LCP 배열도 동시에 선형 시간에 계산하도록 설계하였다. S‑type, L‑type 구분과 S* 샘플링을 이용한 재귀 정렬 과정에서 LCP 값을 전파하고, 각 버킷 내부에서 최소값을 효율적으로 찾기 위해 2‑차원 Min‑Heap과 동적 LCA 구조를 도입한다. 실험 결과, 이전의 Kasai‑알고리즘 기반 구현이나 BWT‑의존 방법보다 현저히 빠른 성…
저자: Johannes Fischer
본 논문은 문자열 인덱싱에서 핵심적인 두 데이터 구조인 suffix array와 LCP 배열을 동시에 선형 시간에 구축하는 새로운 알고리즘을 제시한다. 기존 연구에서는 suffix array를 빠르게 만들기 위해 인듀스 정렬(Induced Sorting) 기법을 도입했으며, LCP 배열은 별도의 O(n) 알고리즘(Kasai 등)이나 BWT‑기반 O(n²) 실용 알고리즘에 의존해 왔다. 이러한 상황에서 저자들은 인듀스 정렬 과정 자체에 LCP 정보를 삽입함으로써 두 구조를 한 번에 생성하는 방법을 고안했다.
**1. 배경 및 기존 연구**
Suffix array는 텍스트의 모든 suffix를 사전식 순서대로 정렬한 배열이며, LCP 배열은 인접한 suffix 쌍 사이의 공통 접두사의 길이를 저장한다. 1990년대 이후 다양한 선형 시간 suffix array 알고리즘이 제안됐지만, 실제 구현에서는 “선형이지만 빠르지 않다”는 평가를 받았다. 2009년 Nong 등은 인듀스 정렬을 이용해 실제 실행 속도가 매우 빠른 선형 시간 알고리즘을 발표했으며, 이는 현재 가장 널리 사용되는 구현 중 하나다. 반면 LCP 배열은 Kasai 알고리즘이 널리 쓰이지만, suffix array가 완성된 뒤에 별도로 수행해야 하며, 메모리 접근 패턴이 비효율적이었다. 최근 BWT‑기반 O(n²) 실용 알고리즘이 등장했지만, BWT가 사전에 필요하고 알파벳 크기에 따라 성능이 달라지는 한계가 있었다.
**2. 인듀스 정렬 핵심 개념**
텍스트 T를 오른쪽에서 왼쪽으로 스캔해 각 suffix를 S‑type(다음 suffix보다 사전식으로 작음) 혹은 L‑type(그 외)으로 라벨링한다. S‑type 중에서도 바로 앞 suffix가 L‑type인 경우를 S\* suffix라 부른다. 전체 suffix 중 S\*는 약 절반 이하이며, 이들을 추출해 새로운 문자열 T′(각 S\* substring에 고유 번호 부여)로 만든 뒤, T′에 대해 동일한 인듀스 정렬을 재귀적으로 수행한다. 재귀 깊이는 O(log n) 이하이며, 전체 복잡도는 T(n)=T(n/2)+O(n)=O(n)이다.
**3. LCP 배열을 위한 확장**
인듀스 정렬은 크게 네 단계로 이루어진다. (1) S\* suffix 정렬, (2) S‑type 버킷에 삽입, (3) L‑suffix를 좌→우 스캔하면서 유도, (4) S‑suffix를 우←좌 스캔하면서 유도. 저자들은 단계 1에서 S\* suffix의 LCP 값을 재귀 호출을 통해 얻고, 단계 2~4에서 새로운 suffix가 버킷에 삽입될 때마다 이미 알려진 인접 suffix 쌍의 LCP를 활용해 현재 LCP를 ℓ+1 로 바로 계산한다. 구체적으로, 현재 삽입 위치 k가 버킷 내 첫 번째라면 LCP
원본 논문
고화질 논문을 불러오는 중입니다...
댓글 및 학술 토론
Loading comments...
의견 남기기