透過的データ圧縮
Transparent Data Compression
K. Sadakane and R. Grossi: Squeezing Succinct Data Structures into
Entropy Bounds, Proc. ACM-SIAM SODA 2006, to appear.
九州大学システム情報科学研究院
定兼 邦彦
2005年11月22日
背景
• データ圧縮の目的 (過去)
– ディスク容量の節約
– 通信コスト(料金,時間)の削減
保存用
• データ圧縮の目的 (現在)
– アクセスの高速化 (CPU速度 > ディスク速度)
– 連続的なアクセスに限られる
• ランダムアクセスができたらどうなるか
2
透過的データ圧縮
もし圧縮データの任意部分を高速に復元できれば
• データを圧縮したまま保存できる
– ディスク容量の節約
– 高速なアクセスが可能
• 圧縮されていることを意識しなくていい
3
本研究の結果
• 長さ n の文字列 S を圧縮 (アルファベットサイズ)
• サイズ: LZ78 [Ziv, Lempel 78] と漸近的に同じ
 nlog  log log n  k  
 bits
nH  O
k


log n


(Hk: S の k 次経験的エントロピー)
• S の i 文字目からの連続する log n 文字
(log n ビット) を定数時間で復元可能 (decode(S,i))
(計算モデル: word RAM (語長 log n ビット))
• このアクセス時間は未圧縮の場合と同じ
4
研究の動機
• Succinctデータ構造を更に圧縮したい
–
–
–
–
bit vector
検索木
グラフ
圧縮接尾辞木
5
Succinctデータ構造
• あるデータ集合 D を格納するデータ構造
• データ構造のサイズ: 情報理論的下限に近い
– 情報理論的下限 L = log (D の場合の数)
• 高速な問合せが可能
– 補助的なデータ構造 (索引) を使用
– サイズ: 漸近的に無視できる (o(L) bits)
6
集合のSuccinctデータ構造
• 集合 D  {1,2,...,n} を格納
• 問合せ (定数時間)
– member(D,i): D 中に i が存在するか
– rank(D,i): D 中の i 以下の要素の数
– select(D,j): D 中で j 番目に小さい要素
• サイズ: n + o(n) bits [J89] [M96]
1
i
n
S: 01000110001001000001
rank(D,i) = 3
7
木のSuccinctデータ構造
• n 節点の順序木 T を格納
– 通常のデータ構造は O(n log n) bits
• Tは
1  2n 
   4n 通り存在
n 1  n 
(Catalan数)
– 情報理論的下限 = 2n  (log n) bits
• 問合せ(定数時間)
– 長男,兄弟,親,深さ,preorder,子孫の数など
• サイズ: 2n  o(n) bits [MR01] [GRR04]
a
a b c d
b
c
e
d
e
S ((()())())
木を括弧列 S で表現
8
問: Succinctデータ構造は
それ以上圧縮できないか?
• 答: 場合によっては可能
• 例: 集合 D  {1,2,...,n} の要素数が少ない場合
n
• 要素数が m の集合は   通り
 m
n
n
Bm, n  log   m log  n  mlog
 m
•
m
n
nm
bitsで表現できるはず
Bm, n  On loglog n / log n bitsのデータ構造でmember,
rank, selectを定数時間で返すものが存在 [RRR02]
FID (Fully Indexable Dictionary) と呼ばれる
9
FIDを用いたポインタの圧縮
ある n ビットのデータ構造(ビット列)へのポインタ m個
を格納する場合
• ポインタの値 i を S[i] = 1 で表現
• S をFIDで圧縮.ポインタはselectで求まる
• m = O(n/log n) のとき,FIDのサイズは
n


 n
 n log log n 
 n log log n 
n 
  O
  O
  O

log
log
n / log n 
 O(n / log n) 
 log n
 log n 
 log n 
ビット列
S
000000010000000000001000000000001000000000000100000000
10
問: 木のSuccinctデータ構造は
圧縮できるか?
• FIDでは不可能
– ( と ) が同数ある ⇒ B(n,2n) = 2n bits 必要
– 2n + O(n log log n/log n) bits [GRR04]
• データ間の相関を考慮する必要がある
– FIDでは 0 次のエントロピーまで圧縮
n
n
Bm, n   m log  n  m  log
m
nm
 nH 0
– k 次のエントロピーまで圧縮したい
11
本研究の圧縮法の応用
• 集合 D  {1,2,...,n} に対するmember, rank, select
を定数時間で返すデータ構造
• サイズ: nHk+O(n log log n/log n) bits (k=O(log log n))
– Hkは D を表す0,1列 S の k 次経験的エントロピー
• EID (Entropy-Bound Indexable Dictionary) と呼ぶ
• FID よりもさらに小さい
nHk  nHk 1    nH0  Bm, n
12
EIDのデータ構造とアルゴリズム
• データ構造
– D を表す0,1列 S を圧縮したもの nHk+O(n log log n/log n) bits
(任意の連続する log n ビットを定数時間で復元可)
– FIDの補助データ構造 O(n log log n/log n) bits
• 問合せアルゴリズム
– FIDとほぼ同じ (S[i,i+log n1] へのメモリ参照を
decode(S,i)に置き換える)
• どんな問合せの計算量も漸近的には同じ
13
木のSuccinctデータ構造の圧縮
• FIDでは不可能
– 2n + O(n log log n/log n) bits [GRR04]
• EIDでは可能
–
–
–
–
木を表現する括弧列 S の Hk まで圧縮可 (k=O(log log n))
2nHk + O(n log log n/log n) bits
問合せの計算量は圧縮前と同じ
構造が同じ部分木があると Hk は小さくなる
(接尾辞木で特に有効)
14
EIDの圧縮サイズの限界
• S = 010101...010101 を圧縮する場合
– FID: nH0 = n bits (+ O(n log log n/log n))
– EID: nH1 = O(log n) bits (+ O(n log log n/log n))
• エントロピーが小さいと第2項が無視できない
• rank を定数時間で返すデータ構造のサイズは
(n log log n/log n) bits [Miltersen 05]
つまり第2項は最適
15
従来の圧縮法
16
従来の圧縮法
辞書式圧縮法
統計的圧縮法
LZ77 [Ziv, Lempel 77]
PPM[Cleary, Witten 84]
PPMD [Howard 93]
LZ78 [Ziv, Lempel 78]
PPM*[Cleary, Teahan, Witten 95]
LZW[Welch 84]
block sorting
compress
LZSS [Storer, Szymanski 82] [Burrows, Wheeler 94]
高圧縮率、PPMより高速 (bzip2)
gzip
context tree weighting
[Willems, Shtarkov, Tjalkens 95]
PPMより高圧縮率
17
LZ77圧縮法
• 文字列を辞書へのポインタで置き換える
• 辞書 = すでに圧縮した文字列
....a compressed suffix tree consists of a compressed suffix
array, a Pat tree and edge-length information.
....a compressed suffix tree consists of [l=19, d=36]
array, a Pat [l=4, d=51] and edge-length information.
圧縮率は文字列のエントロピーに収束
18
PPM
• 文字を1文字ずつ符号化
• 各文字の符号は文脈から決まる
– 文脈:符号化する文字の直前の k 文字
1
• 圧縮サイズ: nHk  k ns  pc log p
cA
sA
c
abcababc
文脈
符号化する文字
19
高次圧縮の問題点
• k 次のエントロピーの圧縮率を達成するには隣接
する文字列の情報を用いて圧縮する必要がある
• 一部分を復元する場合も全体を復元ことになる
k=4
c omp r e s s i o n
20
従来の圧縮法との比較
漸近的圧縮率
log n ビットの復号時間
LZ77 [ZL77]
nHk
O(n)
LZ78 [ZL78]
nHk
O(n)
PPM [CW84]
nHk
O(n)
CTW [WST95]
nHk
O(n)
Block Sorting
[BW94]
本研究
nHk
 log2 n

O
 log n  log  [GGV03]
 log log n

nHk
O(1)
21
新圧縮法の概要
LZ78の改良+補助データ構造
22
LZ78 圧縮法
• 文字列を辞書中のフレーズに分割
a 1 b
• 数字に置き換えて符号化
• 辞書を更新
2
a
a 3
LZ-trie
4 b
b
7
5 b
6
8
S = aaabbbaaaabbbb
2 3 4 5
出力
6
7
8
1a 2a 1b 4b 3a 2b 5b
23
LZ78の圧縮率
[Ziv, Lempel 78]
長さ n の文字列 S を分解したフレーズの数 c は
n
( : アルファベットサイズ)
n c
log n
• 圧縮後のサイズ: clogc  log  bits
• S が定常エルゴード情報源 (エントロピー H) から
生成されるなら c log c  H (n  )
n
• S の k 次経験的エントロピーHkに対し
n
c log c  nH k  c log  (kc  c)
c
[Kosaraju, Manjini 99]
24
本研究のデータ構造
a 1 b
a 2 b
a 3
6 b
5
7 b
Tを表現する括弧列
4
S = aaabbbaaaabbbb
R
P
T
2 3 6 7
4
1 2 4 5
7
5
8
10 12
Tの枝ラベル
1 2 3 4
8
5
6 7 8
フレーズの添字を格納
E (((())())((())))
添字が
T のpreorderと一致す
a
a
a
b
b bb
C
るように付け替える
フレーズの開始位置を格納 25
decodeアルゴリズム
S[i,i+log n1] を復号する場合
1. S[i] を含むフレーズ p を求める
2. p を表すLZ-trieのノード v を求める
3. v から根に向かうパス上のラベルを復号
S = aaabbbaaaabbbb
a 1 b
a 2 b
a 3
4
6 b
5
R
P
2 3 6 7
4
5
8
1 2 4 5 7 10 12
7 b
8
26
Long phraseの復号
• Long phrase: 長さ w = ½ log n 以上のフレーズ
branching node (根へのパスを格納)
枝分かれ無し(定数時間で復号可)
jump node (子孫をw/2個以上持つ)
micro tree (jump nodeの子孫)
定数時間で復号可
27
Short phraseの復号
• Short phrase: 長さ w = ½ log n 未満のフレーズ
• Sの長さ ½ log n の部分列はshort phraseを O(log n)
個含む可能性あり ⇒ 定数時間で復号できない
• r > 1 個の連続するshort phraseをそのまま格納
– 対応する R は格納しない
• データ構造のサイズは増加しない
– R を格納する場合: r log c bits
– そのまま格納する場合: ½ log n bits
– ½ log n < r log c (∵ n  c)
28
まとめ
新圧縮法の提案
• 任意の文字列を高次エントロピー限界まで圧縮
• 部分列の定数時間復号 (未圧縮と同じ時間)
応用
• 既存の索引構造のサイズを改善
• 検索速度も同じ
• 個々の索引ごとに圧縮法を考える必要がない
課題
• 文字列の更新
29
• LZ77などの改良
ダウンロード

透過的データ圧縮