もっふる!アルゴリズム

echizen_tm
5.20, 2012

4人のロシア人の方法
—  Method of Four Russians
= MoFR
= もっふる!

—  大きなデータに対する処理を高速化する方法
—  データを小さなブロックに分割して

1ブロックを1データとみなして問題を解く

—  1ブロックに対する結果は

全パターンを事前に計算してテーブル化しておく

—  もっふる!自体は汎用性のあるアルゴリズムだが
今回は編集距離の高速化を例として説明する

編集距離
—  Edit Distance

= Levenshtein Distance
= DP matching

—  文字列uから文字列vに変形するのに必要な
挿入・削除・置換の回数

—  文字列どうしの字面上の近さを表す
—  類似文字列検索の基礎となる技術
—  もっふる!で編集距離を高速化できる

編集グラフ(1/2)

—  編集距離は編集グラフ上の最短経路の長さ
—  twitterとtuitarの編集距離は3 (置換*2 + 削除*1)
—  最短経路はダイクストラ法で求めることが出来る

編集グラフ(2/2)
—  あるノード(i,j)のスコアs(i,j)は以下のようにして求める

—  挿入コスト = s(i, j - 1) + 1
—  削除コスト = s(i - 1, j) + 1
—  置換コスト = s(i - 1, j - 1) + (1 - δ(u[i - 1], v[j - 1]))

—  s(i, j) = min(挿入コスト, 削除コスト, 置換コスト)

もっふる!で高速化
—  文字列長nの文字列どうしの編集距離を考える
—  編集距離は編集グラフの各ノードについて
最短経路を計算する

—  ノードの数はn^2個
—  各ノードの最短経路は

隣り合うノードからすぐに求まるのでO(1)

—  よって編集距離の時間計算量はO(n^2)
—  これをもっふる!でO(log(c) * n^2 / log(n))に改善する
—  cは文字種の数

もっふる!の概要(1/3)
—  編集グラフのノード数はn^2
—  編集グラフをサイズtのブロックに分割
—  1つのブロックを1ノードとみなして編集距離を計算
—  ノード数が(n/t)^2になる

—  ブロック内の編集距離はテーブル化しておく
—  テーブルへのアクセスはO(t)かかる
—  テーブルの構築時間は文字種の数をcとして(2c)^(2t) * t^2

—  全体の時間計算量は

O((n/t)^2) * O(t) = O((n^2 / t))

もっふる!の概要(2/3)
—  もっふる!によって編集距離の時間計算量は
O((n^2 / t))となった

—  しかしテーブル構築に(2c)^(2t) * t^2
だけ時間がかかってしまう

—  ここでブロックサイズをt = log(n)/2(log(c) + 1)とする
—  (2c)^(2t) * t^2

= 2^(2t(log(c) + 1)) * t^2
= 2^(log(n)) * (log(n) / 2(log(c) + 1))^2
= O(n * (log(n) / log(c))^2)

もっふる!の概要(3/3)
—  ブロックサイズをt = log(n)/2(log(c) + 1)とすると
—  編集距離の時間計算量は
O(n^2 / t) = O(log(c) * n^2 / log(n))
—  テーブル構築の時間計算量はO(n * (log(n) / log(c))^2)

—  全体の計算量はO(log(c) * n^2 / log(n))
—  当初の目的である高速化が達成された

続く(かも)

Sign up to vote on this title
UsefulNot useful