Succinct なトライの実験 その 5

実験に用いた LoudsPlusTrie(LOUDS++)のソースコードにミスを発見しました.子ノードへの移動に用いる関数 child() において rank() を無駄に呼び出すという誤りにより,以前の実験結果(2009-10-29 - やた@はてな日記, 2009-10-30 - やた@はてな日記, 2009-11-03 - やた@はてな日記)では,検索時間が少し長くなっていました.

sumire-tries の修正版を既にアップロードしてあります.

そして,修正後の実験結果を以下に示します.

用いたコーパスは以前の実験と同じであり,以下のようになっています.

ID コーパス キー数 平均キー長(bytes)
jawiki 日本語版 Wikipedia タイトル一覧 942,390 20.4
enwiki 英語版 Wikipedia タイトル一覧 6,437,567 18.6
ja1gms 日本語版 Google n-gram コーパスの 1-gram 2,565,427 18.8
en1gms 英語版 Google n-gram コーパスの 1-gram 13,588,391 8.3

次の表は,すべてのキーを辞書順に検索するのに要した時間(秒)を示しています.

ラベル昇順 jawiki enwiki ja1gms en1gms
BasicTrie 0.84 6.36 2.81 10.29
SuccinctTrie 3.49 33.34 12.71 57.14
LoudsTrie 4.00 27.67 12.04 37.87
LoudsPlusTrie(旧) 3.01 19.91 8.43 23.54
LoudsPlusTrie(新) 2.77 18.56 7.84 22.16
(新)/(旧) 92.0% 93.2% 93.0% 94.1%
出現頻度降順 jawiki enwiki ja1gms en1gms
BasicTrie 0.36 2.60 1.04 4.81
SuccinctTrie 0.77 5.52 2.40 13.05
LoudsTrie 2.50 16.34 6.70 20.91
LoudsPlusTrie(旧) 2.35 15.00 6.07 16.31
LoudsPlusTrie(新) 2.13 13.65 5.48 14.89
(新)/(旧) 90.6% 91.0% 90.3% 91.3%

次の表は,すべてのキーをランダム順に検索するのに要した時間(秒)を示しています.

ラベル昇順 jawiki enwiki ja1gms en1gms
BasicTrie 1.32 12.17 4.29 20.89
SuccinctTrie 5.61 67.47 21.09 123.48
LoudsTrie 5.99 51.48 17.54 56.50
LoudsPlusTrie(旧) 4.95 49.66 14.78 46.07
LoudsPlusTrie(新) 4.59 47.55 13.71 44.55
(新)/(旧) 92.7% 95.8% 92.8% 96.7%
出現頻度降順 jawiki enwiki ja1gms en1gms
BasicTrie 0.75 6.80 2.42 13.38
SuccinctTrie 2.35 23.07 7.06 40.69
LoudsTrie 4.41 39.85 12.54 39.56
LoudsPlusTrie(旧) 4.21 43.65 12.39 38.18
LoudsPlusTrie(新) 3.89 41.75 11.10 36.61
(新)/(旧) 92.4% 95.6% 89.6% 95.9%

以前の実験結果と比べると,LoudsPlusTrie の検索時間が 4 〜 10% 程度短縮されています.また,日本語コーパスと英語コーパスで比べてみると,日本語コーパスを対象としているときに,より検索時間を短縮できています.

日本語コーパスに対する検索時間の短縮効果が高い理由としては,平均的にキーが長く,キーの総数が少ないという特徴により,child() を呼び出す割合が高くなったからと考えられます.

追記(2009-01-09):考察において,「キーの総数が多いという特徴」となっていた部分を「キーの総数が少ないという特徴」に修正しました.