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

全文検索のアルゴリズムとデータ構造

toyama
December 13, 2020
160

 全文検索のアルゴリズムとデータ構造

toyama

December 13, 2020
Tweet

Transcript

  1. パターンマッチング
 例 • “アメリカンジョーク” に “カンジョー” は含まれる? ◦ Yes •

    “任意コードジッコウ” に “ドジッコ” は含まれる? ◦ Yes
  2. パターンマッチング
 例 • “アメリカンジョーク” に “カンジョー” は含まれる? ◦ Yes •

    “任意コードジッコウ” に “ドジッコ” は含まれる? ◦ Yes • “Linux” に “Linx” は含まれる?
  3. パターンマッチング
 例 • “アメリカンジョーク” に “カンジョー” は含まれる? ◦ Yes •

    “任意コードジッコウ” に “ドジッコ” は含まれる? ◦ Yes • “Linux” に “Linx” は含まれる? ◦ No
  4. 記法,用語の導入
 • 文字列 T の長さを |T| と書く ◦ T =

    “abc” のとき |T| = 3 ◦ S = “efghi” のとき |S| = 5
  5. 記法,用語の導入
 • prefix ◦ 文字列の先頭部分を抜き出してきた文字列 ◦ “ABC” の prefix -

    “ABC”, “AB”, “A”, “” • suffix ◦ 文字列の末尾部分を抜き出した文字列 ◦ “ABC” の suffix - “ABC”, “BC”, “C”, “”
  6. Rolling Hash - ラビンカープ法
 • 部分文字列のハッシュを高速に計算できる • 文字列を B 進数として解釈して

    MOD をとるだけ ◦ B > 1 の正整数 ◦ 素数で MOD を取ると一様分布しやすい
  7. Rolling Hash - ラビンカープ法
 • 文字列 S のハッシュ値が既に計算済み ◦ S

    の末尾に 1 文字付け加える: O(1) ◦ S の先頭を 1 文字削除: O(1) • 検索位置をスライドしながらハッシュ値を計算可能 A I Z U U N I V U N I V P: T:
  8. Rolling Hash - ラビンカープ法
 • 文字列 S のハッシュ値 h ◦

    S.push(c): h * B + c ◦ S.erase(0): h - S[0] * B^|P| A I Z U U N I V U N I V P: T:
  9. Rolling Hash - ラビンカープ法
 • 文字列 S のハッシュ値 h ◦

    S.push(c): h * B + c ◦ S.erase(0): h - S[0] * B^|P| A I Z U U N I V U N I V P: T:
  10. Rolling Hash - ラビンカープ法
 • 文字列 S のハッシュ値 h ◦

    S.push(c): h * B + c ◦ S.erase(0): h - S[0] * B^|P| • 検索位置のスライドが O(1) A I Z U U N I V U N I V P: T:
  11. Rolling Hash - ラビンカープ法
 • 文字列 S のハッシュ値 h ◦

    S.push(c): h * B + c ◦ S.erase(0): h - S[0] * B^|P| • 検索位置のスライドが O(1) • O(|T| + |P|) A I Z U U N I V U N I V P: T:
  12. Suffix Trie
 • T の suffix を全部 Trie に入れちゃお!w •

    マジでこれだけ T = “ababc” a b a b c c b a b c c c
  13. Suffix Trie
 • T の suffix を全部 Trie に入れちゃお!w •

    マジでこれだけ • 構築時間: O(|T|^2) • 空間計算量: O(|T|^2) • 検索時間: クエリ毎 O(|P|)
  14. 実測
 • AOJ ALDS1 - 14 D を解いてみます ◦ https://onlinejudge.u-aizu.ac.jp/courses/lesson/1/ALDS1/14/

    ALDS1_14_D • 冒頭の問題設定と全く同じ • |T| < 1,000,000 • |P| < 1,000 • クエリ数 10,000
  15. 参考文献
 • 秋葉拓哉, 岩田陽一, 北川宣稔 プログラミングコンテストチャレンジ ブック[第二版] - マイナビ出版 •

    Anselm Blumer, Janet Blumer, David Haussler, Andrzej Ehrenfeucht, M. T. Chen, and Joel I. Seiferas. The smallest automation recognizing the subwords of a text. Theoretical Computer Science, 40:31–55, 1985.