15
ウェーブレット行列 最速攻略 〜予告編〜 echizen_tm Sep. 16, 2012

Wavelet Matrix Overview

Embed Size (px)

Citation preview

ウェーブレット行列 最速攻略 〜予告編〜

echizen_tm Sep. 16, 2012

はじめに �  今回の発表では

ウェーブレット行列(Wavelet Matrix) というデータ構造の話をします

ウェーブレット行列? �  ウェーブレット行列は

任意のデータ列に対して ある範囲内に 特定のデータがいくつあるかを 定数時間で計算することができます

例えばどういうこと?(1)

4 7 6 5 3 2 1 0 1 4 1 7

この範囲に 1がいくつあるか知りたい!

例えばどういうこと?(2)

4 7 6 5 3 2 1 0 1 4 1 7

この範囲に 3以下の数がいくつあるか知りたい!

でも普通に計算すると

4 7 6 5 3 2 1 0 1 4 1 7

範囲の長さに比例した 時間がかかる・・・

もし範囲内に データが1億件あったら

4 7 6 5 1 0 1 4 1 7

1回の計算で 1億に比例した時間がかかる!

・・・

これは困る �  どんなに長いデータ列に対しても

ある範囲内に 特定のデータがいくつあるかを 同じ時間で計算したい!

それ、 ウェーブレット行列でできるよ

�  ウェーブレット行列は 任意のデータ列に対して ある範囲内に 特定のデータがいくつあるかを 定数時間(=データ数に依存しない時間)で計算 することができます!(再掲)

つまり ウェーブレット行列があると

�  2000万のユーザデータの ID1,000,000からID5,000,000の範囲で 年齢が20歳以上のユーザが何人いるかが 定数時間でわかる

�  5000人の社員データの 社員番号2000から5000の範囲で 年収が500万以上の社員が何人いるかが 定数時間でわかる

�  この中に1人、妹がいる!かどうかが 定数時間でわかる

ウェーブレット行列って デメリットとかないの?

�  定数時間で計算ってことは インデックスとか余計なデータが必要なんじゃないの? →簡潔データ構造を使っているので データ数に対して充分に小さいインデックスで大丈夫 →簡潔データ構造はデータの動的更新は向いてないので 固定された大きなデータに対して参照が多い場合に有効

�  定数時間っていってもデータ数に依存しないだけで そんなに速くないんじゃないの? →ウェーブレット木(既存手法)の2倍高速

ウェーブレット行列の 活用例(1)

�  FM-Index �  接尾辞配列(Suffix Array)型の検索アルゴリズムでは

最も性能が良いと言われている �  データサイズを小さくするために

テキストをBWT(Burrows Wheeler変換)で圧縮している �  検索時にRBWT(逆Burrows Wheeler変換)で

必要な部分だけ解凍

�  RBWTは内部でデータの特定範囲に クエリ内の文字がいくつ含まれるかを計算している

�  ウェーブレット行列で大幅に効率化!

ウェーブレット行列の 活用例(2)

�  gwt �  tb_yasu氏による

大規模グラフ類似度計算ソフトウェア �  当初はウェーブレット木が利用されていたが

最近ウェーブレット行列に置き換わった �  詳しくはブログをチェック!

�  tb_yasuの日記 http://d.hatena.ne.jp/tb_yasu/20120909/1347196146

ウェーブレット行列の ライブラリ

�  libcds: 論文著者(F. Claude)の実装 様々な簡潔データ構造が実装されたすごいライブラリ https://github.com/fclaude/libcds

�  wavelet-matrix-cpp: takeda25さんの実装 wat-array互換。rank高速化(後述)あり。他にも工夫がたくさん https://github.com/hiroshi-manabe/wavelet-matrix-cpp

�  shellinford: echizen_tmの実装 FM-Indexライブラリ。rank高速化したウェーブレット行列を含む https://code.google.com/p/shellinford/

ウェーブレット行列の 論文・解説記事

�  [1] “The Wavelet Matrix” Claude & Navarro; SPIRE2012 http://www.dcc.uchile.cl/~gnavarro/ps/spire12.4.pdf

�  [2] アスペ日記(takeda25さんのブログ) http://d.hatena.ne.jp/takeda25/

�  [3] EchizenBlog-Zwei(echizen_tmのブログ) http://d.hatena.ne.jp/echizen_tm/