LCP 어레이

LCP array
LCP 어레이
유형어레이
발명자Manber & Myers (1990)
O 표기의 시간 복잡성공간 복잡성
평균최악의 경우
공간
건설

컴퓨터 과학에서 가장 긴 공통 프리픽스 배열(LCP 배열)은 접미사 배열의 보조 데이터 구조입니다.정렬된 서픽스 배열에서 연속되는 모든 서픽스 쌍 사이의 가장 긴 공통 프리픽스(LCP)의 길이를 저장합니다.

예를 들어, A : =aab [ , , , , ]가 접미사 배열인 경우 A[1] = A[2] = 사이의 가장 긴 공통 접두사는 길이가 1이므로 LCP 배열 H에서 H[2] = 1입니다. 마찬가지로 A[2] = A[3] = H3의 LCP는 다음과 같습니다.

서픽스 어레이를 LCP 어레이로 증강하면 서픽스 [1][2]트리의 하향식 및 상향식 트래버설을 효율적으로 시뮬레이션하여 서픽스 어레이의[3] 패턴 매칭을 고속화할 수 있으며 압축 서픽스 [4]트리의 전제 조건이 됩니다.

역사

LCP 배열은 1993년 [3]Udi Manber와 Gene Myers가 문자열 검색 알고리즘의 실행 시간을 개선하기 위해 접미사 배열과 함께 도입했습니다.

정의.

A A 문자열 , s, n-$(\ Ss_{ 접미사 배열로 . 여기서$(\ 고유하고 사전학적으로 작은 문자입니다.[ , S [ , ]{ display S }는 i { i } { display j 의 서브스트링을 따라서 S[ [ , S [ [ i] , }는 S{ S 입니다.

( ,) { } ( , ) denote 、 2 v [ ]와 w{ w 사이의 가장 긴 공통 프레픽스의 길이를 나타냅니다.그러면 LCP H [ 과 같은 배열입니다 H 정의되지 H[ lcp (S [ [- , , S [ , ){ H [ i ]= \} ( S [ [ i - 1 ] , ] ) , [ , n ] < in \ < i \ nH [ \ H [i 사전 편찬상 작은 접미사의 가장 긴 공통 접두사 와 접미사 배열의 이전 접미사를 저장합니다.

LCP 배열과 접미사 배열의 차이:

  • 접미사 배열: 배열의 각 접미사의 사전 순위를 나타냅니다.
  • LCP 어레이:사전 편집에 따라 정렬된 후 연속된 두 접미사 간의 최대 길이 접두사 일치가 포함됩니다.

S banana S

i 1 2 3 4 5 6 7
S[i] b a n a n a $

및 대응하는 정렬된 접미사 AA):

i 1 2 3 4 5 6 7
A[i] 7 6 4 2 1 5 3

접미사가 세로 방향으로 배열된 접미사 배열:

i 1 2 3 4 5 6 7
A[i] 7 6 4 2 1 5 3
S[A[i], n][1] $ a a a b n n
S[A[i], n][2] $ n n a a a
S[A[i], n][3] a a n $ n
S[A[i], n][4] $ n a a
S[A[i], n][5] a n $
S[A[i], n][6] $ a
S[A[i], n][7] $

다음으로 LCP H(\ H 사전 편집적으로 연속되는 서픽스를 비교하여 가장 긴 공통 프레픽스를 결정합니다.

i 1 2 3 4 5 6 7
H[i] 정의되어 있지 않다 0 1 3 0 0 2

들어 [4 ]3 { [ 4 3 { H [ 4]= [, 7 ]= { [S [4 , 7 ]= ana . 가 됩니다.사전 편집상 작은 서픽스가 없기 때문에H [ { H [ }는 되어 있지 않습니다.

효율적인 구축 알고리즘

LCP 배열 구축 알고리즘은 접미사 배열의 부산물로 LCP 배열을 계산하는 알고리즘과 LCP 값을 계산하기 위해 이미 구성된 접미사 배열을 사용하는 알고리즘의 두 가지 범주로 나눌 수 있습니다.

Manber & Myers(1993)는 서픽스 배열과 함께 LCP 배열을 O logn O n 시간으로 하는 알고리즘을 제공합니다.Kérkaiinen & Sanders(2003)는 LCP 어레이도 계산하도록 O 시간 알고리즘을 변경할 수 있음을 보여준다.카사이 등 (2001)는 텍스트와 서픽스 배열에 따라 LCP 배열을 계산하는 첫 O( n) \ O ( ) Time Algorithm (FLaAP )를 합니다.

각 텍스트 기호가 1바이트이고 서픽스 또는 LCP 배열의 각 엔트리가 4바이트라고 가정할 때 알고리즘의 주요 단점은 , 서픽스 배열, LCP 배열)의 바이트에 불과하다는 것입니다.따라서 Manzini(2004)는 Kasai의 알고리즘을 개량한 버전을 만들었다. (2001) (lcp9) 및 공간 점유율을 줄였습니다.Kérkkaiinen, ManziniPuglisi(2009)는 Kasai 알고리즘\displaystyle - algorithm)을 개선하여 실행 시간을 향상시킵니다.이 알고리즘은 실제 LCP 배열이 아닌 permated LCP(PLCP; 치환 LCP) 배열을 구축합니다.이 배열에서는 값이 사전 순서가 아닌 텍스트 순서로 표시됩니다.

Gog & Ohlebusch(2011)는 이론적으로는 느리지만((2 O 실제로는 위의 알고리즘보다 빠르다는 두 가지 알고리즘을 제공한다.

2012년 현재 가장 빠른 선형 시간 LCP 어레이 구축 알고리즘은 Fischer(2011년)에 의한 이며, 이는 Nang, Zhang & Chan(2009)의 가장 빠른 서픽스 배열 구축 알고리즘(SA-IS) 중 하나에 기초하고 있습니다.유타 모리의 DivSufSort를 기반으로 한 Fischer & Kurpicz(2017)는 더욱 빠르다.

적용들

Abouelhoda, Kurtz & Ohlebusch(2004)가 지적한 바와 같이 다음과 같은 종류의 트리 트래버설을 통해 몇 가지 문자열 처리 문제를 해결할 수 있습니다.

  • 완전한 서픽스 트리의 상향식 트래버설
  • 서픽스 트리의 서브트리의 톱다운 트래버설
  • 서픽스 링크를 사용하여 서픽스 트리를 트래버설합니다.

카사이 등 (2001)에서는 서픽스 배열과 LCP 배열만을 사용하여 서픽스 트리의 상향식 트래버설을 시뮬레이트하는 방법을 보여 줍니다.Abouelhoda, Kurtz Ohlebusch(2004)는 LCP 배열 및 추가 데이터 구조를 사용하여 서픽스 배열을 확장하여 이 확장 서픽스 배열을 사용하여 3종류의 서픽스 트리 트래버설을 모두 시뮬레이트하는 방법을 설명합니다.Fischer & Heun(2007)범위 최소 쿼리에 대해 LCP 어레이를 전처리함으로써 확장 접미사 어레이의 공간 요건을 줄입니다.따라서 확장 접미사 [2]배열로 서픽스 트리 알고리즘으로 해결할 수 있는 모든 문제도 해결할 수 있습니다.

P P SS 서브스트링인지 판단하려면 서픽스 배열만 사용하는 경우 log 시간이 .또한 LCP 정보를 사용함으로써 이 바인드를 O[3] log n O n 시간으로 할 수 있습니다.Abouelhoda, Kurtz & Ohlebusch(2004)는 최적의 O 시간을 달성하기 위해 이 실행 시간을 더욱 향상시키는 방법을 보여줍니다.따라서 서픽스 배열 및 LCP 배열 정보를 사용하면 서픽스 트리를 사용하는 것처럼 신속하게 결정 쿼리에 응답할 수 있습니다.

LCP 배열은 압축된 접미사 트리의 필수적인 부분이기도 합니다.접미사 트리 기능은 접미사 링크 및 가장 낮은 공통 상위 [5][6]쿼리와 같은 완전한 접미사 트리 기능을 제공합니다.또한 접미사 배열과 함께 사용하여 O() \ O ( )으로 [2][7][8][9]Lempel-Ziv LZ77 인수분해를 계산할 수 있습니다.

(\ n)의문자열 Sdisplaystyle S 대해 가장 오래 반복되는 서브스트링 문제 배열A(\A)와 LCP 배열 모두를 하여 n 해결할 수 있습니다.LCP 어레이의 최대값 v a v {\ 저장되어 있는 대응하는 i {\ i 찾으려면 LCP 어레이를 통해 선형 스캔하면 됩니다.최소 2회 발생하는 가장 긴 서브스트링은 [ [ , [ + x - S [ [ ],[] + _ { - 1

이 섹션의 나머지 부분에서는 LCP 어레이의 다음 두 가지 애플리케이션에 대해 자세히 설명합니다.문자열의 서픽스 배열과 LCP 배열을 사용하여 대응하는 서픽스 트리를 구축하는 방법 및 LCP 배열의 범위 최소 쿼리를 사용하여 임의의 서픽스에 대한 LCP 쿼리에 응답하는 방법.

패턴 발생 횟수 찾기

T N N(\ N[3]에서 특정 P m P m의 발생 횟수를 찾으려면 ,

  • T{\ T 접미사 배열에 대해 이진 검색을 사용하여 모든 P{\ P 및 끝 위치를 찾습니다.
  • 검색 속도를 높이기 위해 LCP 어레이, 특히 LCP 어레이의 특수 버전(아래 LCP-LR)을 사용합니다.

표준 바이너리 검색(LCP 정보 없음)을 사용할 때의 문제는 실행해야 각 ON O N 비교에서 P를 서픽스 배열의 현재 엔트리와 비교한다는 것입니다.즉, 최대 m자의 문자열 전체를 비교합니다.복잡도는 ( N ){ O ( \ N)} 입니다.

LCP-LR 어레이는 다음과 같은 방법으로 + logN)\+\ N로 개선합니다.

바이너리 검색 알고리즘의 어느 시점에서도, 종래와 같이 접미사 배열의 범위 와 그 M M 고려하여 왼쪽 서브 범위 에서 검색을 계속할지를 결정합니다., , ){。판정을 위해 P PM(\ M의 문자열과 합니다.P P M M과 동일한 경우 이 완료됩니다그러나 그렇지 않은 경우의 첫 ({P 비교한 후P({ P 사전 편찬적으로M({M보다 작은지 하였습니다다음 단계에서는 ( {(와) 새로운 M { M'}을) 고려합니다

M ........ M' ....알고 있는 R: lcp(P,M)==k

여기서 문제는 O1O(lookup이 M M M M)의 가장 긴 공통 프레픽스를 나타내도록 LCP-LR이 미리 계산된다는 것입니다

이전 에서) M {\ M 자체의 접두사가{{P : c ( , ) { \{} (, M ) k 개의 문자가 .

  • 사례 1:k<>l cp(M, M′){\displaystyle k<, \mathrm{lcp}(M,M의)}, 즉 P{P\displaystyle}. 이 M의(k+1)-th 성격'을 의미하는 그 M의, 그리고 이후 P사전 편찬 상. M보다 크면, 그 사전 편찬 상.보다 더 커야만 한다 같은 상식에서 M으로 적은 접두사 문자보다 MM'와 공통점만 가지고 있다.M'too. 오른쪽 절반(M', ...R)으로 계속 진행합니다.
  • 사례 2:k>l cp(M, M′){\displaystyle k>, \mathrm{lcp}(M,M의)}, 즉 P{P\displaystyle}공통적으로 M{M\displaystyle}과 더 많은 접두사 문자보다 M{M\displaystyle}공통적으로 M′{\displaystyle M의}과 맺고 있다. M.에 결과적으로, 만약 우리가 비교할 P{P\displaystyle}′ M 공통 접두사는 k k보다 M M 사전 편찬상P(\ P보다 크므로 실제로 비교하지 않고 왼쪽 절반
  • 케이스 3: ( , ) { k = \ {} ( , ' )} 。따라서 M과 M'은 모두 첫 k { k자의P { P 동일합니다.왼쪽 절반으로 계속할지 오른쪽 절반으로 계속할지 결정하려면 ( 1)번째문자부터 하여 P P M M 하면 됩니다.
  • 우리는 반복적으로 계속한다.

전체적인 효과는 P P 문자가 텍스트의 어떤 문자와도 두 번 이상 비교되지 않는다는 것입니다.문자 비교의 총수는 m{\ m으로 제한되어 있기 때문에 총 복잡도는 O + N {\ O 입니다.

서픽스 배열의 임의의 2개의 엔트리 사이의 lcp를O(O(1)의 으로 알 수 있도록 LCP-LR을 미리 계산해야 합니다.표준 LCP 배열에서는 연속되는 엔트리의 만 얻을 수 있습니다., i\ i \displaystyle i 대해 사용할 수 있습니다.다만, 상기의 설명에 기재된 MM과 반드시 연속되는 것은 아닙니다.

여기서 중요한 것은 바이너리 검색 중에 특정 범위 , (LR))만 발생한다는 것을 인식하는 것입니다.항상 ( 으로시작하고 중앙에서 분할한 후 왼쪽 또는 으로 반복하여 절반씩 분할합니다.다른 관점에서 보면: 서픽스 배열의 모든 엔트리는 바이너리 검색 중 정확히 하나의 가능한 범위의 중앙점으로 발생합니다.따라서 바이너리 검색 중에 역할을 할 수 있는 N개의 고유 범위)(\ M R 있습니다.이러한 범위에서는 p M와 l (\displaystyle \ ( 사전에 할 수 있습니다레인지즉, 값이 미리 계산된 이므로 LCP-LR의 는 O O입니다.

또한 표준 LCP 어레이에서 LCP-LR의 2N O 시간 로 계산하는 간단한 재귀 알고리즘이 있습니다.

정리하면:

  • LCP-LR은 LCP에서O ( {\O ( 시간 ( ( {\O ()= 공간으로 할 수 있습니다.
  • 바이너리 검색 중에 LCP-LR을 사용하면 검색 절차를 O logN O N에서 O + g O N로 가속화할 수 있습니다.
  • 2개의 바이너리 검색을 사용하여 PP의 범위의 왼쪽 끝과 오른쪽 끝을 판별할 수 있습니다.일치 범위의 길이는 P의 발생 횟수에 대응합니다.

접미사 트리 구성

S ,,n$ { \ 접미사 A(\ A LCP H(\ H 지정하면해당 접미사 S)가 될 수 있습니다.다음 아이디어를 기반으로 합니다.사전 편집상 가장 작은 접미사에 대한 부분 접미사 트리에서 시작하여 접미사 배열에서 지정된 순서대로 다른 접미사를 반복해서 삽입합니다.

0 in 0 i n의 부분 서픽스 트리로 합니다. d S 루트에서로의 모든 경로 라벨 연결 길이입니다.

케이스 1 ( ( ) [ + { d ( v ) n $\ S = b a $\ S = b a n $ \ s = b na\ display style s \ display style \ $ \ $ \ $ tree tree tree tree tree tree tree tree tree tree tree tree tree tree tree tree tree tree tree tree tree tree to to to to to to to to to to to toto to to to to to to to to to to to to to to to to to to to to 다음 그림과 같이 na라는 가 트리에 추가됩니다.오른쪽 끝 경로는 빨간색으로 강조 표시됩니다.

루트만으로 된 트리인 S 0 ST_부터 시작합니다.[ + A[ + ]{ style _ {} } 、 최근 삽입된 A [ 에서 시작하여 루트까지 오른쪽 끝에 있는 ( v d 1 ( \ d로 이동합니다.

다음 두 가지 경우를 구분할 필요가 있습니다.

  • + : 루트 \ vequals equals equals equals equals equals equals onatenatenatenatenatenatenatenA i A [ A [ + A [ + 가장 긴 공통 프레픽스입니다.
    이 경우A[ i + 1 A + ]{ v}의 새로운 x { x}로서 하고 가장자리 ){(v , x )}에 S [i+n의 따라서 엣지 라벨은 루트 v 라벨 연결로 표현되지 않은 A [+ {{ A 나머지 문자로 구성됩니다.
    그러면 부분 + 1(\1로 생성됩니다.
    케이스 2 ( () < [ + d ( ) < + ] } : a$ a \ na \$ 를 추가하려면 이전에 삽입한 a$ \ na \ 에지를 분할해야 .새로운 내부 노드에 대한 새로운 엣지에는 a na a na 중 가장 긴 공통 프레픽스로 라벨이 부착되어 있습니다.두 leaf를 연결하는 엣지에는 프레픽스의 일부가 아닌 나머지 서픽스 문자가 라벨이 부착되어 있습니다.
  • : 루트 투v { 경로의 라벨이 연결된 경우 A [[+ 긴 공통 접두사보다 적은 문자가 표시되며 누락된 문자가 v엣지에 포함되어 있음을 의미합니다오른쪽따라서 이 에지를 다음과 같이 분할해야 합니다.
    w를 S 의 가장 오른쪽 경로에 vv의 이라고 .
  1. 가장자리 ,) { , ) 를 삭제합니다.
  2. S [ [ + () A[ ] +D ( ) 、 [ i + 1 - { S [ [ ]+ ()의 새로운 내부 새로운엣지 (v 추가합니다.새 라벨은 A[ { A [ ] aaA [ i] a a [ + 1]{ [ i + 1]} the the the ofersersersersersersersersersersersersersersersersersersersersersers of of of of of of of of of of따라서 루트 투 y 경로의 라벨을 연결하면 A[ \A [ i] A[ + \A [ + 의 가장 긴 공통 프레픽스가 표시됩니다.
  3. 생성된 내부 S[ [ + [ + [ + () - 1 { S [ i ]+ 1w {w}를 합니다.새 라벨은 삭제된 에지 v ,w)의 나머지 문자(, w ) \ , w ) \displaystyle (v , w) \ (v , y ) \display ( v , )} )로 구성됩니다.
  4. [ + A [ + ]{ x}{ }의 새로운 에 S[ [ + [ + 1엣지 ( , x 연결합니다 따라서 엣지 라벨은 루트 v 라벨 연결로 표현되지 않은 A [+ {{ A 나머지 문자로 구성됩니다.
  5. 그러면 부분 + 1(\1로 생성됩니다.

단순한 상각 인수는 이 알고리즘의 실행 시간이 O( O ( )로을 나타냅니다.

에서 (마지막 v(\ v하고) S 끝에 있는 를 걸어 올라가 횡단한 노드는 A[+ A 트리에 새 리프로 추가되면 경로에서 삭제됩니다.이러한 노드는 이후의 모든 > \ j 에서는 다시 통과하지 않습니다.따라서 가 모두 통과합니다.

임의 접미사에 대한 LCP 쿼리

LCP H {\ H에는 배열A {\ A의 모든 연속된 접미사 쌍 중 가장 긴 공통 접두사 길이만 됩니다. 단, 역접미사 A- {\A } ([] A j({S})에서 시작하는 S [ S최소 디스플레이스타일의 쿼리에서 - [ Aj 위치에 됩니다.e: 임의 접미사의 가장 긴 공통 접두사 길이를O (O(1) 시간으로 합니다.

접미사 배열의 사전적 순서에 접미사S [, n] { [ i , n} 및 [ , { S [ , n ]{ S[ j , n]의 모든 접미사 A-[ 의 위치 사이의 접두사여야 합니다접미사 A - [ A^ { - }[ { displaystyle j의 위치따라서 이들 서픽스가 공유하는 최장 프리픽스의 길이는 H[ [ +,A - [ H [ A^ { - } [ ]+ { - 1 ][ ]}입니다.이 값은 범위 최소 쿼리에 대해H(\ H 사전 처리되는 일정 시간 내에 찾을 수 있습니다.

n)와문자열S(\ i,2개의 의 위치 i S)가 A - [A - [ j됩니다.\ { - 1 [ i]< S[ S n S])의 가장 긴 공통 프리픽스의 길이는 다음과 같이 계산할 수 있습니다. δ() [ 1 -

메모들

레퍼런스

  • Abouelhoda, Mohamed Ibrahim; Kurtz, Stefan; Ohlebusch, Enno (2004). "Replacing suffix trees with enhanced suffix arrays". Journal of Discrete Algorithms. 2: 53–86. doi:10.1016/S1570-8667(03)00065-0.
  • Manber, Udi; Myers, Gene (1993). "Suffix Arrays: A New Method for On-Line String Searches". SIAM Journal on Computing. 22 (5): 935. CiteSeerX 10.1.1.105.6571. doi:10.1137/0222058. S2CID 5074629.
  • Kasai, T.; Lee, G.; Arimura, H.; Arikawa, S.; Park, K. (2001). Linear-Time Longest-Common-Prefix Computation in Suffix Arrays and Its Applications. Proceedings of the 12th Annual Symposium on Combinatorial Pattern Matching. Lecture Notes in Computer Science. Vol. 2089. pp. 181–192. doi:10.1007/3-540-48194-X_17. ISBN 978-3-540-42271-6.
  • Ohlebusch, Enno; Fischer, Johannes; Gog, Simon (2010). CST++. String Processing and Information Retrieval. Lecture Notes in Computer Science. Vol. 6393. p. 322. doi:10.1007/978-3-642-16321-0_34. ISBN 978-3-642-16320-3.
  • Kärkkäinen, Juha; Sanders, Peter (2003). Simple linear work suffix array construction. Proceedings of the 30th international conference on Automata, languages and programming. pp. 943–955. Retrieved 2012-08-28.
  • Fischer, Johannes (2011). Inducing the LCP-Array. Algorithms and Data Structures. Lecture Notes in Computer Science. Vol. 6844. pp. 374–385. arXiv:1101.3448. doi:10.1007/978-3-642-22300-6_32. ISBN 978-3-642-22299-3.
  • Manzini, Giovanni (2004). Two Space Saving Tricks for Linear Time LCP Array Computation. Algorithm Theory - SWAT 2004. Lecture Notes in Computer Science. Vol. 3111. p. 372. doi:10.1007/978-3-540-27810-8_32. ISBN 978-3-540-22339-9.
  • Kärkkäinen, Juha; Manzini, Giovanni; Puglisi, Simon J. (2009). Permuted Longest-Common-Prefix Array. Combinatorial Pattern Matching. Lecture Notes in Computer Science. Vol. 5577. p. 181. doi:10.1007/978-3-642-02441-2_17. ISBN 978-3-642-02440-5.
  • Puglisi, Simon J.; Turpin, Andrew (2008). Space-Time Tradeoffs for Longest-Common-Prefix Array Computation. Algorithms and Computation. Lecture Notes in Computer Science. Vol. 5369. p. 124. doi:10.1007/978-3-540-92182-0_14. ISBN 978-3-540-92181-3.
  • Gog, Simon; Ohlebusch, Enno (2011). Fast and Lightweight LCP-Array Construction Algorithms (PDF). Proceedings of the Workshop on Algorithm Engineering and Experiments, ALENEX 2011. pp. 25–34. Retrieved 2012-08-28.
  • Nong, Ge; Zhang, Sen; Chan, Wai Hong (2009). Linear Suffix Array Construction by Almost Pure Induced-Sorting. 2009 Data Compression Conference. p. 193. doi:10.1109/DCC.2009.42. ISBN 978-0-7695-3592-0.
  • Fischer, Johannes; Heun, Volker (2007). A New Succinct Representation of RMQ-Information and Improvements in the Enhanced Suffix Array. Combinatorics, Algorithms, Probabilistic and Experimental Methodologies. Lecture Notes in Computer Science. Vol. 4614. p. 459. doi:10.1007/978-3-540-74450-4_41. ISBN 978-3-540-74449-8.
  • Chen, G.; Puglisi, S. J.; Smyth, W. F. (2008). "Lempel–Ziv Factorization Using Less Time & Space". Mathematics in Computer Science. 1 (4): 605. doi:10.1007/s11786-007-0024-4. S2CID 1721891.
  • Crochemore, M.; Ilie, L. (2008). "Computing Longest Previous Factor in linear time and applications". Information Processing Letters. 106 (2): 75. CiteSeerX 10.1.1.70.5720. doi:10.1016/j.ipl.2007.10.006.
  • Crochemore, M.; Ilie, L.; Smyth, W. F. (2008). A Simple Algorithm for Computing the Lempel Ziv Factorization. Data Compression Conference (dcc 2008). p. 482. doi:10.1109/DCC.2008.36. hdl:20.500.11937/5907. ISBN 978-0-7695-3121-2.
  • Sadakane, K. (2007). "Compressed Suffix Trees with Full Functionality". Theory of Computing Systems. 41 (4): 589–607. CiteSeerX 10.1.1.224.4152. doi:10.1007/s00224-006-1198-x. S2CID 263130.
  • Fischer, Johannes; Mäkinen, Veli; Navarro, Gonzalo (2009). "Faster entropy-bounded compressed suffix trees". Theoretical Computer Science. 410 (51): 5354. doi:10.1016/j.tcs.2009.09.012.
  • Fischer, Johannes; Kurpicz, Florian (5 October 2017). "Dismantling DivSufSort". Proceedings of the Prague Stringology Conference 2017. arXiv:1710.01896.

외부 링크