13
Rank/Select 자료구조 및 웨이블릿 트리의 성능 비교 실험 Empirical Performance Evaluation of Wavelet Trees and Rank/Select Data Structures 김성환 부산대학교 컴퓨터공학과 [email protected] 요약 웨이블릿 트리는 임의 알파벳 상에서 정의된 문자열의 Rank/Select 질의를 처리하기 위한 자료구조이다. 이 자료구조는 이진문자열 상에서의 Rank Select 질의 처리 기법을 직접 적으로 이용하기 때문에 기본적인 Rank/Select 자료구조를 어떤 것으로 사용하느냐에 따라 성능이 결정된다. 데이터 특성이나 웨이블릿 트리 구성 방식에 따라 기본 자료구조를 선택 하는 문제가 결정되며 그에 따른 성능에 차이가 있을 수 있다. 본 보고서에서는 Rank/Select 자료구조를 구현한 기존의 라이브러리의 사용법과 간단한 성능 실험을 수행하며, 다양한 비트벡터 자료구조에 따른 웨이블릿 트리 상의 질의 탐색 실험을 수행하고 결과를 검토한다. 핵심어 : 웨이블릿 트리, Rank, Select, 문자열 처리 1 서론 특정한 기능을 수행하기 위한 자료구조를 설계함에 있어서 공간을 절약하는 것은 매우 중요하 다. 특히 임베디드 시스템과 같이 메모리의 양이 극히 제약되어 있거나, 일반적인 시스템이라고 하더라도 메모리의 한계에 달하는 대용량의 데이터를 처리하고자 하는 경우 자료구조를 최대한 작은 공간 내에 표현해야 할 필요성이 있다. 만일 어떤 데이터를 표현하기 위한 이론적으로 필요한 최소한의 공간을 Z 라고 할 때, 어떤 기능을 가진 자료구조가 O(Z ) 비트를 사용한다면 이를 compact 하다고 하며, Z + o(Z ) 비트를 사용한다면 이 자료구조를 succinct 하다고 한다. 공간 효율적인 자료구조의 설계에 있어서는 compactness 또는 succinctness 를 고려하여야 한다. 공간효율적인 자료구조는 최근까지도 활발하게 이루어지고 있다. 특히 문자열 처리와 관련 하여 이진문자열 상의 Rank Select 문제가 다른 자료구조들의 기본적인 구성요소나 이론적 근간이 되기 때문에 이에 관한 연구가 활발히 진행되고 있다. 알파벳 Σ= {0, 1} 상의 문자열 X 가 있을 때, 주어진 정수 i 에 대한 Rank Select 질의는 다음과 같이 정의되며 n + o(n) bit 공간을 사용하여 O(1) 시간에 처리할 수 있음이 이론적으로 밝혀진 바 있다 [1]. 1

Rank/Select 자료구조및웨이블릿트리의성능비교실험 Empirical …pearl.cs.pusan.ac.kr/~wiki/images/2/2f/TR13-10-ksh.pdf · 자료구조이다.이자료구조는이진문자열상에서의Rank

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Rank/Select 자료구조및웨이블릿트리의성능비교실험 Empirical …pearl.cs.pusan.ac.kr/~wiki/images/2/2f/TR13-10-ksh.pdf · 자료구조이다.이자료구조는이진문자열상에서의Rank

Rank/Select 자료구조 및 웨이블릿 트리의 성능 비교 실험

Empirical Performance Evaluation of Wavelet Trees andRank/Select Data Structures

김성환

부산대학교 컴퓨터공학과

[email protected]

요약

웨이블릿트리는임의알파벳상에서정의된문자열의 Rank/Select질의를처리하기위한자료구조이다. 이 자료구조는 이진문자열 상에서의 Rank 및 Select 질의 처리 기법을 직접적으로 이용하기 때문에 기본적인 Rank/Select 자료구조를 어떤 것으로 사용하느냐에 따라성능이 결정된다. 데이터 특성이나 웨이블릿 트리 구성 방식에 따라 기본 자료구조를 선택하는문제가결정되며그에따른성능에차이가있을수있다. 본 보고서에서는 Rank/Select자료구조를 구현한 기존의 라이브러리의 사용법과 간단한 성능 실험을 수행하며, 다양한비트벡터자료구조에따른웨이블릿트리상의질의탐색실험을수행하고결과를검토한다.

핵심어: 웨이블릿 트리, Rank, Select, 문자열 처리

1 서론

특정한 기능을 수행하기 위한 자료구조를 설계함에 있어서 공간을 절약하는 것은 매우 중요하

다. 특히 임베디드시스템과같이메모리의양이극히제약되어있거나, 일반적인시스템이라고

하더라도메모리의한계에달하는대용량의데이터를처리하고자하는경우자료구조를최대한

작은 공간 내에 표현해야 할 필요성이 있다. 만일 어떤 데이터를 표현하기 위한 이론적으로

필요한 최소한의 공간을 Z라고 할 때, 어떤 기능을 가진 자료구조가 O(Z) 비트를 사용한다면

이를 compact하다고 하며, Z + o(Z) 비트를 사용한다면 이 자료구조를 succinct 하다고 한다.

공간 효율적인자료구조의설계에있어서는 compactness또는 succinctness를고려하여야한다.

공간효율적인 자료구조는 최근까지도 활발하게 이루어지고 있다. 특히 문자열 처리와 관련

하여 이진문자열 상의 Rank 및 Select 문제가 다른 자료구조들의 기본적인 구성요소나 이론적

근간이 되기 때문에 이에 관한 연구가 활발히 진행되고 있다. 알파벳 Σ = {0, 1} 상의 문자열

X가 있을 때, 주어진 정수 i에 대한 Rank 및 Select 질의는 다음과 같이 정의되며 n+ o(n) bit

공간을 사용하여 O(1)시간에 처리할 수 있음이 이론적으로 밝혀진 바 있다 [1].

1

Page 2: Rank/Select 자료구조및웨이블릿트리의성능비교실험 Empirical …pearl.cs.pusan.ac.kr/~wiki/images/2/2f/TR13-10-ksh.pdf · 자료구조이다.이자료구조는이진문자열상에서의Rank

!

!!

!

그림 1: 문자열 “ipssm$pissii”에 대한 웨이블릿 트리. 각 노드마다 알파벳을 절반으로 분할한 후알파벳 부분집합으로 구성된 두 subsequence에 대하여 각각 왼쪽 오른쪽 자식 노드로 설정한후 재귀적으로 구성한다.

• Rank(X, i) = |{j ∈ [1 : i] : X[j] = 1}|.

• Select(X, i) = j s.t. Rank(X, j) = i and X[j] = 1.

웨이블릿 트리는 Rank 및 Select 질의를 임의의 크기 σ인 일반적인 알파벳으로 확장하기

위한 자료구조이다 [2]. 이진문자열 상에서의 O(1) Rank/Select 질의 기법을 그대로 사용하되

이진 트리를 구성함으로써 길이 n의 문자열에 대하여 O(n logσ) 공간을 이용하여 Rank 및

Select 질의를 O(logσ) 시간에 처리할 수 있다.

본 보고서에서는 웨이블릿 트리를 이용하여 문자열 탐색을 수행하는 경우 기본 자료구조가

되는 이진문자열 상의 Rank/Select 기법에 따른 성능 차이를 실험적으로 평가해 보고자 한다.

특히 탐색 대상이 되는 데이터 집합의 특성에 따라 어떤 Rank/Select 기법을 사용하는 것이

효율적인지를 중점적으로 실험을 수행한다.

2 웨이블릿 트리

알파벳집합 Σ상의문자열 X에대한웨이블릿트리는다음과같이구성된다. 먼저적당한기준

p ∈ Σ를 두어 ΣL = {a ∈ Σ : a ≤ p}, ΣG = {a ∈ Σ : a > p}로 정의한다. 이 때 ||ΣL| − |ΣG|| ≤ 1

이 되도록 적당한 p를 선택하여 Σ를 가능한 절반에 가깝도록 분할한다. 이후 문자열 X에 대하

여 ΣL으로만 구성된 subsequence와 ΣG로만 구성된 subsequence를 구하여 각각 왼쪽, 오른쪽

자식으로 할당한다. 이후에는 각 자식에 대하여 더 이상 분할할 수 없을 때 까지 재귀적으로

같은 작업을 수행한다.

그림 1은 “mississippi$”의 버로우즈-휠러 변환인 “ipssm$pissii”에 대한 웨이블릿 트리 구조

를 나타낸다. 루트노드에서는 ‘m’를 기준으로 선택하여 ‘m’이하인 심볼로 구성된 subsequence

는 왼쪽 자식으로 나머지는 오른쪽 자식으로 분할됨을 알 수 있다.

2

Page 3: Rank/Select 자료구조및웨이블릿트리의성능비교실험 Empirical …pearl.cs.pusan.ac.kr/~wiki/images/2/2f/TR13-10-ksh.pdf · 자료구조이다.이자료구조는이진문자열상에서의Rank

!

!!

!

"#$%&'()*+,-

"#$% )./+0-1210

"#$% ). +,-23

/2"#$% ).!+3-

"#$%!).0+/-20

.

.!

.0

./

"#$%!).0+/-

(a) Rank 질의 처리 과정

!

!!

!

"#$#%& '()*+,

(

(!

(+

()

"#$#%&!'(+*+,-.-)

"#$#%& '(!*),-.-/

"#$#%&!'( */,-.-0-.-"#$#%&123'4*+,

(b) Select 질의 처리 과정

그림 2: 웨이블릿 트리 상에서의 Rank, Select 질의 처리 과정. (a)

웨이블릿 트리 상에서의 탐색을 위해서 각 노드에 대하여 문자열에 대응하는 이진코드를

생성하여 저장한다. 해당 노드의 기준 심볼 이하인 심볼에 대하여는 0, 나머지는 1로 표현을

한다. 예를 들어, 그림 1의 루트 노드의 경우 ‘m’이하인 심볼에 대하여는 0, ‘m’보다 큰 심볼에

대하여는 1로 표현을 하게 되면 “ipssm$pissii”는 “011100101100”가 된다.

주어진 문자 a와 위치 i에 대하여 Rank 질의 탐색을 수행하는 과정은 다음과 같다. 우

선 루트 노드에서부터 시작하여 노드에 저장된 이진문자열 상에서 Rank 질의를 수행한 결과

j = Rank(X, i)를 구한다. 만일 해당 노드의 기준 심볼 p에 대하여 a ≤ p이면 위치 i까지의 0

의 개수를 i′ = i− j를 구한 뒤 왼쪽 자식 노드로 이동하고, a > p라면 위치 i까지의 1의 개수

i′ = j를 구하고 오른쪽 자식 노드로 이동한다. 부모 노드에서 위치 i에 해당하는 자식 노드의

위치는 i′이므로 부모 노드에서 위치 i까지 a가 나타난 횟수는 자식 노드에서 위치 i′까지 a

가 나타난 횟수와 같다. 위와 같은 과정을 반복하여 수행하면 문자 a에 해당하는 말단 노드에

이르게 되는데 이 때 대응하는 위치가 전체 문자열에서 문자 a가 출현한 횟수가 된다. 이진

문자열에서의 Rank 문제가 O(1)시간에 해결되므로 웨이블릿 트리 상에서는 O(logσ) 시간에

계산된다.

3

Page 4: Rank/Select 자료구조및웨이블릿트리의성능비교실험 Empirical …pearl.cs.pusan.ac.kr/~wiki/images/2/2f/TR13-10-ksh.pdf · 자료구조이다.이자료구조는이진문자열상에서의Rank

!

!

!

!

"#$%&'()*%'+

그림 3:문자열 “ipssm$pissii”에대한허프만형태(Huffman-shaped)웨이블릿트리. 각 문자(또는symbol)에 대하여 허프만 코드를 구한 후 말단 노드까지의 경로가 허프만 코드와 일치하도록트리를 구성한다.

문자 a와 순위 i가 주어졌을때 Select 질의는 문자 a에 해당하는 말단 노드에서부터 시

작한다. 말단 노드의 i번째 a의 위치와 대응하는 부모 노드 상에서의 위치를 계산한다. 만일

해당 말단노드가 부모 노드의 왼쪽 자식이라면 부모 노드에서의 i번째 0, 부모 노드의 오른쪽

자식이라면 i번째 1의위치를 i′이라고하면위치 i′의문자는해당부모노드에서정확히 i번째

출현한 a가 된다. 같은 작업을 루트 노드에 도달할때까지 반복했을 때 최종적으로 구해지는

위치가 바로 전체 문자열 상에서의 i번째 a가 출현하느 자리가 된다. 이진 문자열에서의 Select

문제가 O(1)시간에 해결되므로 웨이블릿 트리 상에서는 O(logσ) 시간에 계산된다.

이러한 구조의 웨이블릿 트리는 그 depth가 ⌈logσ⌉ + 1이며 각 단계별로 o(n) bit에 대한

rank/select 자료구조가 필요하므로, 총 O(n logσ)비트의 공간이 필요하다. 이를 다른 방법으로

계산해보자. 각 문자별로루트노드에서말단노드에이르기까지거쳐가는에지레이블을해당

문자를 표현하기 위한 코드라고 할 수 있다. 예를 들어, 그림 1에서 ‘i’에 해당하는 코드는 001

이다. 말단 노드를 제외하면 각 문자는 해당 문자의 코드 길이만큼 출현한다. 따라서 각 문자의

코드길이가 O(logσ)이고이러한문자가총 n개가있으므로총공간이 O(n logσ)가된다. 만일

각문자를나타내는코드를보다짧게표현할수있다면전체웨이블릿트리가차지하는공간도

줄일 수 있다.

허프만 코딩 (huffman coding)은 엔트로피 기반의 압축 기법 중 가장 기본적인 방법이다.

허프만 코딩으로 압축하는 경우 한 문자가 H0 = −∑

a∈Σ pa log pa (단, pa = a/σ)bit에 표현된

다. 웨이블릿 트리를 구성함에 있어 각 심볼에 대하여 루트 노드에서 말단 노드로 가는 경로가

해당심볼의허프만코드와일치하도록구성하게되면 O(nH0) bit의공간을이용하여웨이블릿

트리를 표현할 수 있다 [3]. 이 때, 로그 부등식에 따라 항상 H0 ≤ logσ가 성립하므로 원래의

웨이블릿 트리에 비하여 공간을 절약할 수 있다.

4

Page 5: Rank/Select 자료구조및웨이블릿트리의성능비교실험 Empirical …pearl.cs.pusan.ac.kr/~wiki/images/2/2f/TR13-10-ksh.pdf · 자료구조이다.이자료구조는이진문자열상에서의Rank

그림 3은 문자열 “ipssm$pissii”에 대한 허프만형태 웨이블릿 트리를 나타내고 있다. 허프

만형태의 웨이블릿 트리를 구성하는 비트의 수 (38 bit)가 원래의 웨이블릿 트리 (41 bit)에 비

하여 작다는 사실을 확인할 수 있다. 본 예제에서는 단지 3 bit만 차이가 나므로 허프만코드를

참조하기위한룩업테이블까지고려하게되면공간적으로이득이있는것은아니지만문자열의

길이가 길어질수록 공간효율성이 증가하게 된다.

3 Rank/Select질의를 지원하는 라이브러리

3.1 SDSL(Succinct Data Structure Library)

SDSL는 비트 벡터 및 비트 벡터 상의 rank/select 질의, 정수 벡터, 웨이블릿 트리, 압축 접미사

트리 및 배열, 범위 최소 질의 등을 구현해 놓은 C++ 라이브러리이다 [4].

리눅스 환경에서

1 $ wget https://github.com/simongog/sdsl/archive/master.zip2 $ unzip master3 $ cd sdsl-master4 $ ./install.sh [DIRECTORY]

1번째줄은 SDSL소스코드압축파일을다운받는과정이다. 2번째줄의명령을통해압축을

풀고, 해당 디렉토리로 이동하여 (3번째 줄 명령), 이미 잘 만들어진 설치 쉘스크립트 파일을

실행시키면 된다 (4번째 줄 명령). 이 때, 1번째 인자로 설치를 할 기본 디렉토리를 설정할 수

있는데 현재 유저에 대하여만 설치하는 경우 알맞은 경로를 설정해 줄 수 있다.

SDSL 라이브러리를 이용한 기본적인 rank 질의를 수행하는 소스코드는 다음과 같다. 표

1에 SDSL에서 지원하는 클래스를 나열하였다. 비트벡터 클래스 내에 rank나 select 함수가

내장되어 있는 다른 일반 라이브러리와는 달리 SDSL에서는 비트벡터 클래스와 rank, select

색인 클래스가 분리되어 있으므로 필요에 따라 선언하여 사용하면 된다.

Source 1 SDSL Example

1 sdsl::bit_vector b( 1000, 0 );2 for( int i = 0; i < 1000; ++i ) {3 b[i] = random1bit();4 }5 sdsl::rrr_rank_support<>::bit_vector_type bv(b);6 sdsl::rrr_rank_support<> rs( &bv );7

8 cout << rs.rank(500) << endl;

5

Page 6: Rank/Select 자료구조및웨이블릿트리의성능비교실험 Empirical …pearl.cs.pusan.ac.kr/~wiki/images/2/2f/TR13-10-ksh.pdf · 자료구조이다.이자료구조는이진문자열상에서의Rank

표 1: SDSL 라이브러리에서 지원하는 rank 및 select 클래스rank selectrank_support_interleaved select_support_interleavedrrr_rank_support rrr_select_support [1]rank_support_v [5]rank_support_v5 [5]

select_support_mcl [6]sd_rank_support sd_select_support [7]gap_rank_support gap_select_supportrank_support_jmc [8]

SDSL 라이브러리를 사용한 소스코드를 컴파일하는 경우 -lsdsl 옵션을 사용해야 하며

별도의 디렉토리에 설치를 한 경우 헤더 및 라이브러리 디렉토리를 설정해 주어야 한다. 예를

들어 [DIRECTORY]를 $HOME으로 설정한 경우에는 다음과 같이 컴파일한다.

1 $ g++ test.cpp -I$HOME/include -L$HOME/lib -lsdsl

3.2 Sux

Sux는 succinct 자료구조들을 broadword로 구현한 라이브러리로, 비트벡터, 균형잡힌 괄호에

대한 64bit 환경에서의 구현을 포함하고 있다. C++과 Java로 구현되어 있으며, Java구현에는

이외에 최소 완전 해시 함수 등도 구현되어 있다 [9].

다음은 Sux라이브러리를설치하는과정이다. Sux의 C++소스는체계적으로라이브러리화

되어있지는않다. 배포되는소스코드에 makefile은있지만이는테스트용바이너리를생성하는

용도이기 때문에 라이브러리로 사용하기 위해서는 따로 컴파일 및 복사를 해 주어야 한다.

1 $ wget http://sux.di.unimi.it/sux-0.8.tar.gz2 $ tar xfzp sux-0.8.tar.gz3 $ cd sux-0.84 $ g++ -c -O3 jacobson.cpp rank9.cpp rank9sel.cpp5 $ ar vrcs libsux.a jacobson.o rank9.o rank9sel.o6 $ cp *.hpp [INCLUDE_DIRECTORY]7 $ cp libsux.a [LIB_DIRECTORY]

Sux의 압축된 소스 코드를 다운 받았다면 (1번째 줄), 압축을 풀고 (2번째 줄), 해당 디렉토

리로 이동한다 (3번째 줄). 4번째 줄에서는 Sux의 jacobson과 rank9, rank9sel 클래스가 구현된

소스코드를컴파일하여오브젝트코드로만드는과정이고 5번째줄에서이들의컴파일결과물을

하나의파일 sux.a로묶는다. 6번째줄과 7번째줄은각각 Sux의헤더파일과구현부를 include및

lib 디렉토리로 복사하는 과정이다. 일련의 과정이 끝나면 Sux를 이용할 수 있다. Sux를 이용한

간단한 프로그램은 다음과 같다.

6

Page 7: Rank/Select 자료구조및웨이블릿트리의성능비교실험 Empirical …pearl.cs.pusan.ac.kr/~wiki/images/2/2f/TR13-10-ksh.pdf · 자료구조이다.이자료구조는이진문자열상에서의Rank

표 2: Sux 라이브러리에서 지원하는 rank 및 select 클래스class rank selectjacobson [8] ⃝ ×rank9 [5] ⃝ ×rank9sel [5] ⃝ ⃝

Source 2 Sux Example

1 uint64_t b[100];2 for( int i = 0; i < 6400; ++i ) {3 b[i] = random64bit();4 }5 rank9sel rs( b, 6400 );6 cout << rs.rank( 3000 ) << endl;

Sux에서사용할수있는 rank및 select질의를위한비트벡터클래스는표 2와같다. jacobson

과 rank9 클래스는 rank만 지원하며, rank9sel 클래스는 rank와 select를 지원한다. 각 질의는

해당 멤버함수를 통해 수행할 수 있으며 1에 대한 탐색 결과가 반환된다.

SDSL과마찬가지로 Sux을이용한소스코드를컴파일할때에도컴파일러에링커옵션 -lsux

을 붙여줘야 하며, 기본 include 및 lib 디렉토리가 아닌 사용자 정의 디렉토리에 라이브러리를

설치한 경우 -I, -L옵션으로 해당 디렉토리를 지정해 주어야 한다.

3.3 libcds(Compact Data Structure Library)

libcds는 compact 자료구조에 대한 구현으로 비트벡터, 수열 (sequence), 순열 (permutation),

웨이블릿 트리 등을 구현해 놓은 라이브러리이다 [10]. libcds를 설치하는 방법은 다음과 같다.

라이브러리를빌드하기위한 makefile은정의되어있지만헤더파일이나라이브러리파일은직접

복사를 해야 한다.

1 $ wget https://libcds.googlecode.com/files/libcds-0.8alpha.tgz2 $ tar xfzp libcds-0.8alpha.tgz3 $ cd libcds-0.8alpha4 $ make5 $ cp includes/* [INCLUDE_DIRECTORY]6 $ cp lib/libcds.a [LIB_DIRECTORY]

libcds를 이용한 간단한 프로그램은 다음과 같다. libcds에서는 클래스 내에 rank와 select

가 멤버변수로 정의되어 있어 이들을 호출하면 된다. 어떤 비트 (0 or 1)에 대한 연산을 할 것인

지에 따라 멤버변수가 나뉘어져 있다 (예: rank0, rank1). libcds에서 사용가능한 rank/select용

비트벡터는 표 3에 나타나있다.

7

Page 8: Rank/Select 자료구조및웨이블릿트리의성능비교실험 Empirical …pearl.cs.pusan.ac.kr/~wiki/images/2/2f/TR13-10-ksh.pdf · 자료구조이다.이자료구조는이진문자열상에서의Rank

표 3: Libcds 라이브러리에서 지원하는 rank 및 select 클래스class rank selectstatic_bitsequence_brw32 [11] ⃝ ⃝static_bitsequence_rrr02 [1] ⃝ ⃝

Source 3 LibCDS Example

1 uint32_t b[100];2 for( int i = 0; i < 3200; ++i ) {3 b[i] = random32bit();4 }5 static_bitsequence_brw32 rs( b, 3200 );6 cout << rs.rank1( 1000 ) << endl;

이전 라이브러리들과 마찬가지로 libcds 이용하여 만든 소스를 컴파일하는 경우 링커 옵션

-lcds을 이용해야 하며, 설치가 컴파일러의 기본 include, lib 디렉토리 이외의 장소에 이루어

졌을 경우 -I, -L 옵션을 통해 경로를 지정해 주어야 한다.

4 실험

4.1 비트 벡터 상의 Rank/Select 실험

비트 벡터에 대한 성능 평가를 위하여 각 라이브러리의 비트 벡터 구현에 대한 실험을 수행하

였다. 데이터는 20 ∼ 27Mbit의 크기의 비트 벡터에 10% ∼ 90%의 비율로 비트 1을 무작위로

설정하여 만들었다.

4.2 Rank 질의 실험

그림 4-(a)는 SDSL을이용하여 1M길이의비트벡터상에서 rank질의를수행한실험결과이다.

밀도는비트벡터에서의 1의비율을의미한다. rank_support_v클래스의 rank질의속도가가장

바르고 gap_rank_support의 질의 속도가 가장 느린 것을 확인할 수 있다. gap_rank_support

의 경우에는 밀도가 높아짐에 따라 전반적으로 탐색시간이 증가하는 경향이 있으나 나머지

자료구조에서는 뚜렷한 차이가 보이지 않았다.

그림 4-(b)는 같은 실험을 128M 비트벡터 상에서 수행한 결과이다. 순위의 차이에는 큰

변화가 없으며, 전체적으로 질의 시간이 다소 증가한 것을 확인할 수 있다. 이론적으로는 질의

수행시간이 O(1)이지만실제로구현할함에있어서는비트벡터의길이에따라다소증가할수

있음을 알 수 있다. 그러나 이 차이는 캐쉬 히트 문제와 같은 하드웨어의 구조에 따른 영향도

있을 수 있으므로 보다 면밀한 실험적 검토가 추가적으로 필요할 것으로 보인다.

8

Page 9: Rank/Select 자료구조및웨이블릿트리의성능비교실험 Empirical …pearl.cs.pusan.ac.kr/~wiki/images/2/2f/TR13-10-ksh.pdf · 자료구조이다.이자료구조는이진문자열상에서의Rank

0.00

0.05

0.10

0.15

0.20

0.25

0.30

0.35

0.40

0 0.2 0.4 0.6 0.8 1

!"#

$%&'(

)gap

sd

rrr

i1024

i512

v5

jmc

i256

v0.00

0.05

0.10

0.15

0.20

0.25

0.30

0.35

0.40

0 0.2 0.4 0.6 0.8 1

!"#

$%&'(

)

gap

sd

rrr

i1024

i512

v5

jmc

i256

v

(a) 1M (b) 128M

그림 4: SDSL 라이브러리에 내 비트클래스의 rank 질의 비교 실험

0.00

0.01

0.02

0.03

0.04

0.05

0.06

0.07

0 0.2 0.4 0.6 0.8 1

!"#

$%&'(

)

jcb

r9

r9s

0.00

0.02

0.04

0.06

0.08

0.10

0.12

0.14

0.16

0.18

0 0.2 0.4 0.6 0.8 1

!"#

$%&'(

)jcb

r9

r9s

(a) 1M (b) 128M

그림 5: Sux 라이브러리에 내 비트클래스의 rank 질의 비교 실험

그림 5-(a)는 Sux를 이용한 길이 1M 비트벡터 상에서의 rank 질의 실험 결과이다. jaconson

에 비하여 rank9, rank9sel의 성능이 2배가량 차이가 나는 것을 확인할 수 있다. 그러나 이 차이

는 같은 실험을 128M 길이의 비트벡터 상에서 수행한 결과인 그림 5-(b)에서 보이듯이 길이가

늘어날수록 차이가 조금씩 감소하는 것을 확인할 수 있다.

그림 6-(a)는 libcds를이용한 rank질의탐색에서 rrr벡터의 sampling rate에따른질의시간

변화를 나타낸다. sampling rate에 비례하여 탐색 속도가 증가하므로, 시간과 공간의 trade-off

에 맞추어 적절한 값으로 조정할 필요가 있음을 알 수 있다. 6-(b)는 libcds를 이용한 rank 탐색

결과의비교실험을나타낸다. static_bitsequence_brw32클래스가 static_bitsequence_rrr02에

비하여더빠른 rank질의를지원하는것을확인할수있다. 또한 이경우에서도마찬가지로 1M

에 비하여 128M 상에서의 탐색에 시간이 더 걸리는 것을 통해 질의시간이 비트벡터의 길이에

무관하지는 않음을 알 수 있다.

9

Page 10: Rank/Select 자료구조및웨이블릿트리의성능비교실험 Empirical …pearl.cs.pusan.ac.kr/~wiki/images/2/2f/TR13-10-ksh.pdf · 자료구조이다.이자료구조는이진문자열상에서의Rank

Sampling Rate vs Query Time

0.00

2.00

4.00

6.00

8.00

10.00

12.00

14.00

16.00

0 200 400 600 800 1000 1200

!"#

$%&'(

)

*+,-./0123+4&

0.00

0.05

0.10

0.15

0.20

0.25

0.30

0.35

0.40

0 0.2 0.4 0.6 0.8 1

!"#

$%&'(

)

rrr(128M)

rrr(1M)

brw(128M)

brw(1M)

(a) sampling rate에 따른 탐색 시간 변화 (b) 밀도에 따른 탐색 시간 변화

그림 6: libcds 라이브러리에 내 비트클래스의 rank 질의 비교 실험

0.00

0.05

0.10

0.15

0.20

0.25

0.30

0.35

0 0.2 0.4 0.6 0.8 1

!"#

$%&'(

)

rrr

i1024

i512

i256

mcl

sd

gap

0.00

0.10

0.20

0.30

0.40

0.50

0.60

0.70

0.80

0 0.2 0.4 0.6 0.8 1

!"#

$%&'(

)

rrr

i256

i512

i1024

mcl

sd

gap

(a) 1M (b) 128M

그림 7: SDSL 라이브러리에 내 비트클래스의 select 질의 비교 실험

한편 libcds를사용하여실험을하는도중에메모리관련오류가발생하는것이확인되었다.

같은 테스트 코드를 다른 라이브러리의 클래스에 적용하였을 경우에는 오류가 발생하지 않는

것으로 보아 라이브러리 내에 메모리 릭이 있을 가능성을 배제할 수 없다는 것을 추측할 수

있다.

4.3 Select 질의 실험

그림 7-(a)는 SDSL을 이용하여 길이 1M 비트벡터 상에서 select 질의를 수행한 결과를 나

타낸다. gap_select_support 클래스를 이용한 질의가 가장 성능이 좋음을 확인할 수 있으며,

rrr_select_support가가장낮은성능을보였다. rank질의의경우와마찬가지로 128M비트벡터

상에서의 실험 결과인 그림 7-(b)가 보여주듯이 비트벡터의 길이가 증가하면 select 질의 시간

역시 다소 증가하는 것이 확인되었다.

그림 8-(a)는 Sux 및 libcds를 이용하여 1M 비트벡터 상에서 select 질의를 수행한 결과를

10

Page 11: Rank/Select 자료구조및웨이블릿트리의성능비교실험 Empirical …pearl.cs.pusan.ac.kr/~wiki/images/2/2f/TR13-10-ksh.pdf · 자료구조이다.이자료구조는이진문자열상에서의Rank

0.00

0.20

0.40

0.60

0.80

1.00

1.20

1.40

0 0.2 0.4 0.6 0.8 1

!"#

$%&'(

)

rrr

brw

r9s

0.00

0.50

1.00

1.50

2.00

2.50

3.00

3.50

0 0.2 0.4 0.6 0.8 1

!"#

$%&'(

)

rrr

brw

r9s

(a) 1M (b) 128M

그림 8: Sux 및 libcds 라이브러리에 내 비트클래스의 select 질의 비교 실험

보여준다. rank9sel 클래스가 가장 빠른 것을 확인할 수 있다. 그림 8-(b)는 같은 실험을 128M

비트벡터 상에서 수행한 결과이다. 1M의 경우에 비하여 전체적인 탐색 시간이 증가한 것을

확인할 수 있다.

4.4 웨이블릿 트리 상에서의 Rank 실험

웨이블릿트리에대한실험을위하여 BNC(British National Corpus)데이터[12]와 21C세종계획

한글 말뭉치 데이터[13]를 각각 약 3천만자 분량으로 준비하였다. BNC 데이터에서는 영문자를

제외한특수문자, 숫자, 공백문자들을모두제거하였으며, 영문자는 모두소문자로치환하였다.

21C 세종계획 한글 말뭉치 데이터도 마찬가지로 한글문자를 제외한 나머지 문자들은 모두

제거하였으며, 한글문자는 초·중·종성을 분해하여 나열하였다. 실험에는 각각 영문문자열, 한

글문자열및각각의버로우즈-휠러변환된문자열에대한웨이블릿트리및허프만형태의 rank

질의 탐색 시간을 측정하였다.

그림 9에웨이블릿트리상에서의 rank질의탐색결과가나타나있다. 한글의경우는영문에

비하여 알파벳의 크기가 다소 크기 때문에 영문 문자열에 비하여 탐색시간이 전체적으로 다소

길다. 또한 전반적으로 같은 형태의 비트벡터 클래스를 사용하는 경우 허프만 웨이블릿 트리

가 일반 웨이블릿 트리에 비하여 탐색 속도가 더 빠른 것을 확인할 수 있다. rank질의에서는

rank_support_v 클래스를 이용한 허프만 웨이블릿 트리가 전반적으로 좋은 성능을 보였다.

또한버로우즈-휠러변환상에서의탐색속도가원문자열상에서의탐색속도보다다소빠르다

는 사실을 확인할 수 있었다. 버로우즈-휠러 변환시 나타나는 연속된 문자 출현 특성에 기인한

것으로 해석되지만 비트벡터 표현 방식과 결부하여 보다 자세한 분석이 필요할 것으로 보인다.

11

Page 12: Rank/Select 자료구조및웨이블릿트리의성능비교실험 Empirical …pearl.cs.pusan.ac.kr/~wiki/images/2/2f/TR13-10-ksh.pdf · 자료구조이다.이자료구조는이진문자열상에서의Rank

그림 9: SDSL 라이브러리의 웨이블릿 트리 성능 비교 평가

5 결론

본 보고서에서는 비트벡터상에서의 rank/select 질의, 웨이블릿 트리를 구현한 기존의 라이브

러리에 관하여 살펴보고 실험적인 성능 평가를 수행하였다. 본 보고서의 결론은 다음과 같다.

• SDSL 라이브러리에서의 rank_support_v 클래스와 gap_rank_support 클래스가 각각

rank, select 질의 속도가 가장 빠르다는 것을 확인하였으며, 전체적으로 rrr 기법은 다른

기법에 비하여 매우 느렸다.

• 일부 클래스의 경우 비트의 밀도에 따라 성능 차이가 발생하는 경우가 있었지만 전반적

으로는 그 차이가 미미하였다.

• 비트벡터 상에서의 rank/select 질의가 이론적으로는 O(1)시간에 해결되지만 실제로 구

현함에 있어서는 비트벡터의 길이에 전혀 무관하지는 않다는 점을 확인할 수 있었다.

References

[1] R. Raman, V. Raman, and S. Srinivasa Rao. Succinct indexable dictionaries with applica-

tions to encoding of k-ary trees and multi-sets. In Proc. SODA, pages 233–242, 2002.

[2] R. Grossi, A. Gupta, and J. S. Vitter. High-order entropy-compressed text indexes. In

Proc. SODA, pages 841–850, 2003.

[3] V. Makinen and G. Navarro. Succinct suffix arrays based on run-length encoding. In Proc.

CPM, pages 45–56, 2005.

[4] Succinct data structure library. http://simongog.github.io/sdsl/.

12

Page 13: Rank/Select 자료구조및웨이블릿트리의성능비교실험 Empirical …pearl.cs.pusan.ac.kr/~wiki/images/2/2f/TR13-10-ksh.pdf · 자료구조이다.이자료구조는이진문자열상에서의Rank

[5] S. Vigna. Broadword implementation of rank/select queries. In Proc. WEA, pages 154–168,

2008.

[6] D. Clark and I. Munro. Efficient suffix trees on secondary storage. In Proc. SODA, pages

383–391, 1996.

[7] D. Okanohara and K. Sadakane. Practical entropy-compressed rank/select dictionary. In

Proc. ALENEX, pages 60–70, 2007.

[8] G. Jacobson. Space-effcient static trees and graphs. In Proc. FOCS, pages 549–554, 1989.

[9] Sux. http://vigna.di.unimi.it/.

[10] libcds. http://code.google.com/p/libcds/.

[11] R. González, S. Grabowski, V. Mäkinen, and G. Navarro. Practical implementation of rank

and select queries. In Proc. WEA, pages 27–36, 2005.

[12] British national corpus. http://corpus.byu.edu/bnc/.

[13] 21C sejong project. http://www.sejong.or.kr/?

13