Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Numbered Automatonによる文字列の完全ハッシュ

MatsuTaku
November 12, 2019

Numbered Automatonによる文字列の完全ハッシュ

MatsuTaku

November 12, 2019
Tweet

Other Decks in Research

Transcript

  1. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    Numbered Automatonによる
    文字列の完全ハッシュ
    松本拓真
    徳島大学

    View Slide

  2. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    自己紹介
    ❏ 名前: 松本 拓真  Twitter :@MatsuTaku14
    ❏ 所属: 徳島大学大学院先端技術科学教育部 M2
    同大学博士後期進学予定
    ❏ 研究: 文字列辞書、ダブル配列
    ❏ ダブル配列オートマトンの圧縮手法、
    DEIM Forum、2018
    ❏ ダブル配列オートマトンによる圧縮文字列辞書の実装、
    IFAT研究報告、2018
    ❏ 趣味
    ❏ 競技プログラミングAtCoder
    ❏ User: MatsuTaku, highest rating: 1392, highest perf 1933
    ❏ 将棋: 将棋ウォーズ(ゲーム) 2級。相掛かり、角換わりの勉強中
    ❏ アニメ鑑賞:
    Ufotable(fate, 鬼滅の刃), ufotable chinema徳島でアニメ映画鑑賞

    View Slide

  3. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    Numbered Automatonによる
    文字列の完全ハッシュ

    View Slide

  4. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    問題設定
    ❏ 文字列集合を表現し,
    各文字列に異なる整数値IDを割り当てる
    string ID
    a 1
    a b 2
    b a 3
    c a a 4
    c b 5
    ❏ 文字列集合{S1, … , Sn}は辞書順
    に並んでいるとし,
    i番目の文字列SiのIDはiとする.
    ❏ string-to-ID (文字列→IDを応答)
    ID-to-string (ID→文字列を応答)
    の2つの機能を提供する

    View Slide

  5. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    Trie
    ❏ 文字列集合を接頭辞を併合したグラフで表現
    ❏ 各文字列により一意の受理状態へ到達する
    string ID
    a 1
    a b 2
    b a 3
    c a a 4
    c b 5
    1 2
    5
    3
    4
    a
    b
    b a
    c a a
    b
    Trieは,文字列の完全ハッシュを容易に実現する

    View Slide

  6. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    Deterministic Finite Automaton
    ❏ DAWGが有名 (Trieより状態数を少なくできる)
    ❏ 全ての状態の入次数が1でない場合,受理状態と各文字列は対応しない
    string ID
    a 1
    a b 2
    b a 3
    c a a 4
    c b 5
    a b
    b a
    c
    a
    b
    完全ハッシュのための工夫が必要

    View Slide

  7. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    Numbered Automaton [1]
    ❏ DFAのパスに整数値の重みを
    割り当てることで,string-to-IDとID-to-stringを実現
    string ID
    a 1
    a b 2
    b a 3
    c a a 4
    c b 5
    a | 2 b | 1
    b | 1
    c | 2
    a | 1
    b | 1
    | 5
    重み:遷移先以降の経路パターンの数
    a | 1

    View Slide

  8. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    Numbered Automaton [1]
    string ID
    a 1
    a b 2
    b a 3
    c a a 4
    c b 5
    a | 2 b | 1
    b | 1 a | 1
    c | 2
    a | 1
    b | 1
    | 5
    重み:遷移先以降の経路パターンの数
    ❏ DFAのパスに整数値の重みを
    割り当てることで,string-to-IDとID-to-stringを実現

    View Slide

  9. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    Numbered Automaton [1]
    string ID
    a 1
    a b 2
    b a 3
    c a a 4
    c b 5
    a | 2 b | 1
    b | 1 a | 1
    c | 2
    a | 1
    b | 1
    | 5
    重み:遷移先以降の経路パターンの数
    ❏ DFAのパスに整数値の重みを
    割り当てることで,string-to-IDとID-to-stringを実現

    View Slide

  10. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    Numbered Automaton [1]
    string ID
    a 1
    a b 2
    b a 3
    c a a 4
    c b 5
    a | 2 b | 1
    b | 1 a | 1
    c | 2
    a | 1
    b | 1
    | 5
    重み:遷移先以降の経路パターンの数
    ❏ DFAのパスに整数値の重みを
    割り当てることで,string-to-IDとID-to-stringを実現

    View Slide

  11. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    Numbered Automatonによる
    string-to-ID
    入力文字列: Sin
    出力ID: IDout
    w(p): パスpの重み
    カウンター変数: C = 0
    a | 2 b | 1
    b | 1 a | 1
    c | 2
    a | 1
    b | 1
    | 5
    Sinによる経路上の各状態で以下を実行
    ❏ if 受理状態 C = C + 1
    ❏ for p ∈ 現在の状態のパスから辞書順:
    if pが経路ではない C = C + w(p)
    else 遷移を実行し,次の状態へ
    Sinによる遷移が終了したとき,C = IDout
    {

    View Slide

  12. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    Numbered Automatonによる
    string-to-ID
    入力文字列: Sin = ‘caa’
    出力ID: IDout = 4
    w(p): パスpの重み
    カウンター変数: C = 0
    a | 2 b | 1
    b | 1 a | 1
    c | 2
    a | 1
    b | 1
    | 5
    Sinによる経路上の各状態で以下を実行
    ❏ if 受理状態 C = C + 1
    ❏ for p ∈ 現在の状態のパスから辞書順:
    if pが経路ではない C = C + w(p)
    else 遷移を実行し,次の状態へ
    Sinによる遷移が終了したとき,C = IDout
    { C = 0

    View Slide

  13. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    Numbered Automatonによる
    string-to-ID
    入力文字列: Sin = ‘caa’
    出力ID: IDout = 4
    w(p): パスpの重み
    カウンター変数: C = 0
    a | 2 b | 1
    b | 1 a | 1
    c | 2
    a | 1
    b | 1
    | 5
    Sinによる経路上の各状態で以下を実行
    ❏ if 受理状態 C = C + 1
    ❏ for p ∈ 現在の状態のパスから辞書順:
    if pが経路ではない C = C + w(p)
    else 遷移を実行し,次の状態へ
    Sinによる遷移が終了したとき,C = IDout
    { C = 0 + 2
    = 2

    View Slide

  14. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    Numbered Automatonによる
    string-to-ID
    入力文字列: Sin = ‘caa’
    出力ID: IDout = 4
    w(p): パスpの重み
    カウンター変数: C = 0
    a | 2 b | 1
    b | 1 a | 1
    c | 2
    a | 1
    b | 1
    | 5
    Sinによる経路上の各状態で以下を実行
    ❏ if 受理状態 C = C + 1
    ❏ for p ∈ 現在の状態のパスから辞書順:
    if pが経路ではない C = C + w(p)
    else 遷移を実行し,次の状態へ
    Sinによる遷移が終了したとき,C = IDout
    { C = 2 + 1
    = 3

    View Slide

  15. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    Numbered Automatonによる
    string-to-ID
    入力文字列: Sin = ‘caa’
    出力ID: IDout = 4
    w(p): パスpの重み
    カウンター変数: C = 0
    a | 2 b | 1
    b | 1 a | 1
    c | 2
    a | 1
    b | 1
    | 5
    Sinによる経路上の各状態で以下を実行
    ❏ if 受理状態 C = C + 1
    ❏ for p ∈ 現在の状態のパスから辞書順:
    if pが経路ではない C = C + w(p)
    else 遷移を実行し,次の状態へ
    Sinによる遷移が終了したとき,C = IDout
    { C = 3

    View Slide

  16. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    Numbered Automatonによる
    string-to-ID
    入力文字列: Sin = ‘caa’
    出力ID: IDout = 4
    w(p): パスpの重み
    カウンター変数: C = 0
    a | 2 b | 1
    b | 1 a | 1
    c | 2
    a | 1
    b | 1
    | 5
    Sinによる経路上の各状態で以下を実行
    ❏ if 受理状態 C = C + 1
    ❏ for p ∈ 現在の状態のパスから辞書順:
    if pが経路ではない C = C + w(p)
    else 遷移を実行し,次の状態へ
    Sinによる遷移が終了したとき,C = IDout
    { C = 3 + 1
    = 4
    IDout = C = 4

    View Slide

  17. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    Numbered Automatonによる
    ID-to-string
    入力ID: IDin
    出力文字列: Sout
    w(p): パスpの重み
    カウンター変数: C = IDin
    a | 2 b | 1
    b | 1 a | 1
    c | 2
    a | 1
    b | 1
    | 5
    ❏ for p ∈ 現在の状態のパスから辞書順:
    if w(p) < C C = C - w(p)
    if w(p) > C pによる遷移を実行
    if w(p) = C pによる遷移を実行
    if 受理状態 C = C - 1
    if C = 0 return 経路上の文字列
    {

    View Slide

  18. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    Numbered Automatonによる
    ID-to-string
    入力ID: IDin = 4
    出力文字列: Sout = ‘caa’
    w(p): パスpの重み
    カウンター変数: C = IDin
    a | 2 b | 1
    b | 1 a | 1
    c | 2
    a | 1
    b | 1
    | 5
    ❏ for p ∈ 現在の状態のパスから辞書順:
    if w(p) < C C = C - w(p)
    if w(p) > C pによる遷移を実行
    if w(p) = C pによる遷移を実行
    if 受理状態 C = C - 1
    if C = 0 return 経路上の文字列
    { C = 4

    View Slide

  19. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    Numbered Automatonによる
    ID-to-string
    入力ID: IDin = 4
    出力文字列: Sout = ‘caa’
    w(p): パスpの重み
    カウンター変数: C = IDin
    a | 2 b | 1
    b | 1 a | 1
    c | 2
    a | 1
    b | 1
    | 5
    ❏ for p ∈ 現在の状態のパスから辞書順:
    if w(p) < C C = C - w(p)
    if w(p) > C pによる遷移を実行
    if w(p) = C pによる遷移を実行
    if 受理状態 C = C - 1
    if C = 0 return 経路上の文字列
    { C = 4 - 2
    = 2

    View Slide

  20. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    Numbered Automatonによる
    ID-to-string
    入力ID: IDin = 4
    出力文字列: Sout = ‘caa’
    w(p): パスpの重み
    カウンター変数: C = IDin
    a | 2 b | 1
    b | 1 a | 1
    c | 2
    a | 1
    b | 1
    | 5
    ❏ for p ∈ 現在の状態のパスから辞書順:
    if w(p) < C C = C - w(p)
    if w(p) > C pによる遷移を実行
    if w(p) = C pによる遷移を実行
    if 受理状態 C = C - 1
    if C = 0 return 経路上の文字列
    { C = 2 - 1
    = 1

    View Slide

  21. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    Numbered Automatonによる
    ID-to-string
    入力ID: IDin = 4
    出力文字列: Sout = ‘caa’
    w(p): パスpの重み
    カウンター変数: C = IDin
    a | 2 b | 1
    b | 1 a | 1
    c | 2
    a | 1
    b | 1
    | 5
    ❏ for p ∈ 現在の状態のパスから辞書順:
    if w(p) < C C = C - w(p)
    if w(p) > C pによる遷移を実行
    if w(p) = C pによる遷移を実行
    if 受理状態 C = C - 1
    if C = 0 return 経路上の文字列
    { C = 1

    View Slide

  22. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    Numbered Automatonによる
    ID-to-string
    入力ID: IDin = 4
    出力文字列: Sout = ‘caa’
    w(p): パスpの重み
    カウンター変数: C = IDin
    a | 2 b | 1
    b | 1 a | 1
    c | 2
    a | 1
    b | 1
    | 5
    ❏ for p ∈ 現在の状態のパスから辞書順:
    if w(p) < C C = C - w(p)
    if w(p) > C pによる遷移を実行
    if w(p) = C pによる遷移を実行
    if 受理状態 C = C - 1
    if C = 0 return 経路上の文字列
    { C = 1

    View Slide

  23. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    Numbered Automatonによる
    ID-to-string
    入力ID: IDin = 4
    出力文字列: Sout = ‘caa’
    w(p): パスpの重み
    カウンター変数: C = IDin
    a | 2 b | 1
    b | 1 a | 1
    c | 2
    a | 1
    b | 1
    | 5
    ❏ for p ∈ 現在の状態のパスから辞書順:
    if w(p) < C C = C - w(p)
    if w(p) > C pによる遷移を実行
    if w(p) = C pによる遷移を実行
    if 受理状態 C = C - 1
    if C = 0 return 経路上の文字列
    { C = 1 - 1
    = 0
    Sout = ‘caa’

    View Slide

  24. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    Numbered Automatonによる
    string-to-ID, ID-to-string
    ❏ string-to-ID,ID-to-stringの何れも,
    オートマトンを順方向に探索することで実現できる
    ❏ 比較回数は,経路上の状態が持つパス数に依存
    a | 2 b | 1
    b | 1 a | 1
    c | 2
    a | 1
    b | 1
    | 5

    View Slide

  25. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    Numbered Automaton ~ 順位数version ~
    ❏ 順位数:親の状態から辞書順でパスを見たときの,若いパスの重みの合計
    a | 2 → 0 b | 1 → 0
    b | 1 → 2
    a | 1 → 0
    c | 2 → 3
    a | 1 → 0
    b | 1 → 0
    | 5 → 0
    重み → 順位数
    a | w1 → 0
    b | w2 → w1
    c | w3 → w1+w2

    View Slide

  26. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    順位数を用いた
    string-to-ID
    入力文字列: Sin
    出力ID: IDout
    r(p): パスpの順位数
    カウンター変数: C = 0
    a | 0 b | 0
    b | 2 a | 0
    c | 3
    a | 0
    b | 0
    | 0
    Sinによる経路上の各状態で以下を実行
    ❏ if 受理状態 C = C + 1
    ❏ C = C + r(p)
    Sinによる遷移が終了したとき,C = IDout
    {

    View Slide

  27. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    順位数を用いた
    string-to-ID
    入力文字列: Sin = ‘caa’
    出力ID: IDout = 4
    r(p): パスpの順位数
    カウンター変数: C = 0
    a | 0 b | 0
    b | 2 a | 0
    c | 3
    a | 0
    b | 0
    | 0
    Sinによる経路上の各状態で以下を実行
    ❏ if 受理状態 C = C + 1
    ❏ C = C + r(p)
    Sinによる遷移が終了したとき,C = IDout
    { IDout = 0 + 3 + 0 + 0 + 1
    = 4

    View Slide

  28. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    順位数を用いた
    ID-to-string
    入力ID: IDin
    出力文字列: Sout
    r(p): パスpの順位数
    カウンター変数: C = 0
    重み変数: W = 5
    a | 0 b | 0
    b | 2 a | 0
    c | 3
    a | 0
    b | 0
    5 | 0
    ❏ for p ∈ 現在の状態のパスから辞書順:
    if pが最後のパスではない:
    w = r(pの次のパス) - r(p)
    else: w = W - r(p)
    if w < C C = C - w
    if w > C pによる遷移を実行,W = w
    if w = C pによる遷移を実行,W = w
    if 受理状態 C = C - 1
    if C = 0 return 経路上の文字列
    {
    ルートの重みだけ必要

    View Slide

  29. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    順位数を用いた
    ID-to-string
    入力ID: IDin
    出力文字列: Sout
    r(p): パスpの順位数
    カウンター変数: C = 0
    重み変数: W = 5
    a | 0 b | 0
    b | 2 a | 0
    c | 3
    a | 0
    b | 0
    5 | 0
    ❏ for p ∈ 現在の状態のパスから辞書順:
    if pが最後のパスではない:
    w = r(pの次のパス) - r(p)
    else: w = W - r(p)
    if w < C C = C - w
    if w > C pによる遷移を実行,W = w
    if w = C pによる遷移を実行,W = w
    if 受理状態 C = C - 1
    if C = 0 return 経路上の文字列
    {
    ルートの重みだけ必要

    5

    元々の重み
    =順位数の差分

    次のパスの順位数との
    差分から重みを取り出す
    後の操作は同じ

    View Slide

  30. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    順位数を用いた
    ID-to-string
    入力ID: IDin
    出力文字列: Sout
    r(p): パスpの順位数
    カウンター変数: C = 0
    重み変数: W = 5
    a | 0 b | 0
    b | 2 a | 0
    c | 3
    a | 0
    b | 0
    5 | 0
    ❏ for p ∈ 現在の状態のパスから辞書順:
    if pが最後のパスではない:
    w = r(pの次のパス) - r(p)
    else: w = W - r(p)
    if w < C C = C - w
    if w > C pによる遷移を実行,W = w
    if w = C pによる遷移を実行,W = w
    if 受理状態 C = C - 1
    if C = 0 return 経路上の文字列
    {
    ルートの重みだけ必要
    5
    競技単調増加列の中から
    C以下の最大のパスを探す
    問題と考えられる.

    View Slide

  31. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    Numbered Automatonの特徴
    ❏ グラフ表現の自由度が高い
    ❏ 状態数削減のモチベーションが高い用途で有効かも
    ❏ 効率的かどうかは,どう実装するかに依存する.
    ❏ オートマトンはTrieの様に簡潔表現(LOUDS)がなく,
    単純に空間効率が良くなるとは言えない
    ❏ 順位数ver
    ❏ string-to-IDの改善も,
    遷移先が簡単に定まるデータ構造で実装した場合に限る
    ❏ ID-to-string は,次の遷移先が簡単に求まる実装でなければ非効率

    View Slide

  32. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    重みのデータ量としての特徴
    ❏ 親の重み = 子のパスの重みの合計
    つまり,階層が深くなれば重みは小さい値になる
    したがって,全体として重みはほとんどが非常に小さい値で表現される
    →符号化圧縮表現が可能 (DACs, Elias-Fano)
    重み,順位数
    英語Wikipediaタイトル集合のDAWG
    表現での重みと順位数

    View Slide

  33. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    Numbered Automatonの応用
    ❏ 実用例がまだ少ない
    ❏ 順位数
    ❏ 順位数を用いたDAWG辞書の実装(string-to-ID only)[2,3](blog)
    ❏ 重みと順位数ハイブリッドによる圧縮文字列辞書[4]
    ❏ 静的な用途に向いている
    ❏ 動的なオートマトンの構築は計算コストが高い
    ❏ 重みや順位数を圧縮できる

    View Slide

  34. StringBeginners Vol. 9 19/11/12 @ Riken AIP
    参考文献
    [1] Martn-Vide, C.: Scientific Applications of Language
    Methods (2011).
    [2]伊藤, 辞書検索に用いる有限オートマトンの構成と実装、言語処理学会Vol.4.
    pp47-50. 1998.
    [3]sileのブログ。http://sile.hatenablog.jp/entry/20100710/1278784402
    [4] 松本,神田,森田,泓田、ダブル配列オートマトンによる圧縮文字列辞書の実装、
    IPSJ/IFAT研究報告、2018.

    View Slide