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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for toyama toyama
December 13, 2020
320

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

Avatar for toyama

toyama

December 13, 2020

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.