Succinct なトライの実験 その 7(LoudsTrie の修正)

sumire-tries の LoudsTrie に問題を見つけたため,修正しました.

# 修正回数が多すぎますね,本当に….申し訳ありません.

修正版は既にアップロードしてあります.

今回の修正したのは,LoudsTrie の find_child() において,ラベルを取得する度に無駄な rank() を呼び出していたという,性能面で致命的な問題です.

以前と同様の設定で実験したところ,以下の結果が得られました.

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(旧) 3.65 25.56 11.17 36.30
LoudsTrie(新) 2.61 17.40 7.44 21.66
(新)/(旧) 71.5% 68.1% 66.6% 59.7%
LoudsPlusTrie 2.48 16.75 7.14 20.66
出現頻度降順 jawiki enwiki ja1gms en1gms
BasicTrie 0.36 2.60 1.04 4.81
SuccinctTrie 0.77 5.52 2.40 13.05
LoudsTrie(旧) 2.14 14.14 5.80 19.24
LoudsTrie(新) 1.92 12.29 5.03 14.03
(新)/(旧) 89.7% 86.9% 86.7% 72.9%
LoudsPlusTrie 1.82 11.77 4.74 13.32

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

ラベル昇順 jawiki enwiki ja1gms en1gms
BasicTrie 1.32 12.17 4.29 20.89
SuccinctTrie 5.61 67.47 21.09 123.48
LoudsTrie(旧) 5.32 48.84 16.71 55.26
LoudsTrie(新) 4.45 41.04 12.91 43.25
(新)/(旧) 83.6% 84.0% 77.3% 78.3%
LoudsPlusTrie 4.31 46.46 13.28 43.61
出現頻度降順 jawiki enwiki ja1gms en1gms
BasicTrie 0.75 6.80 2.42 13.38
SuccinctTrie 2.35 23.07 7.06 40.69
LoudsTrie(旧) 3.88 37.45 11.06 37.58
LoudsTrie(新) 3.80 35.33 10.27 32.61
(新)/(旧) 97.9% 94.3% 92.9% 86.8%
LoudsPlusTrie 3.70 40.52 10.69 35.18

LoudsTrie の検索時間がかなり短縮された結果,ランダム順の検索時間では LoudsPlusTrie を追い抜きました.キーワード検索が目的であれば,LoudsPlusTrie を使う理由は薄いかもしれません.

ただし,実装による改善の余地は LoudsPlusTrie の方が大きいと思います.