SlideShare a Scribd company logo
2015/06
ローリングハッシュと
Suffix Array
北海道大学 情報知識ネットワーク研究室
情報理工学専攻 修士 1年
栗田 和宏
1
部分文字列検索
✤ テキストT:検索する文字列

テキスト長をnとする.
✤ パターンP:見つけたい文字列

パターン長をmとする.
✤ 自明な方法:O(nm)
2
ナイーブな部分文字列検索
✤ テキスト:abracadabra

パターン:abr
3
abracadabra
abr
ナイーブな部分文字列検索
✤ テキスト:abracadabra

パターン:abr
4
abracadabra
abr
ナイーブな部分文字列検索
✤ テキスト:abracadabra

パターン:abr
5
abracadabra
abr
ナイーブな部分文字列検索
✤ テキスト:abracadabra

パターン:abr
6
abracadabra
abr
ナイーブな部分文字列検索
✤ テキスト:abracadabra

パターン:abr
7
abracadabra
abr
この方法では部分文字列検索に

O(nm)時間かかる
高速な文字列検索
✤ ローリングハッシュを使おう!
✤ 文字列を値にするハッシュ関数を用いて値が一致した
時に文字列が一致したとする.
8
高速な文字列検索
✤ ローリングハッシュを使おう!
✤ 文字列を値にするハッシュ関数を用いて値が一致した
時に文字列が一致したとする.
✤ その前にハッシュとは何か知っていますか?
9
ハッシュとは?
10
https://ja.wikipedia.org/wiki/%E3%83%8F
%E3%83%83%E3%82%B7%E3%83%A5%E9%96%A2%E6%95%B0
ローリングハッシュ
✤ 文字1文字を値とし,その値と基数の積の総和をハッ
シュ値とするハッシュ関数を使う.
11
ローリングハッシュ
✤ 文字1文字を値とし,その値と基数の積の総和をハッ
シュ値とするハッシュ関数を使う.
12
abr = 1*10^2 + 2*10^1 + 5*10^0

= 125
a = 1, b = 2, r = 5, 基数:10
ハッシュ値の計算
✤ 愚直にハッシュ値を毎回計算するとハッシュ値の計算
にO(m)時間かかり,結局O(nm)時間かかってしまう.
13
ハッシュ値の計算
✤ 愚直にハッシュ値を毎回計算するとハッシュ値の計算
にO(m)時間かかり,結局O(nm)時間かかってしまう.
✤ なので,ローリングしながらハッシュ値を計算するこ
とで毎回のハッシュ値計算をO(1)時間にする.
14
ハッシュ値の計算
15
abracadabra
125
abra = 125
ハッシュ値の計算
16
abracadabra
251
abra = 125
ハッシュ値の計算
17
abracadabra
513
abra = 125
ハッシュ値の計算
18
abracadabra
513
1つ前のハッシュ値に基数をかけ,新しい

文字に対応する値を足し,先頭文字に対応

する値を引く.
abra = 125
接尾辞配列(Suffix array)
19
✤ 文字列のある場所から末尾までの文字列を接尾辞

という.
✤ 1つの文字列のすべての接尾辞を辞書順にソートした
ものを接尾辞配列という.
✤ 自明にO(n2log n)で作れる.
接尾辞配列の例
20
✤ abracadabraの接尾辞配列

接尾辞配列で何ができるか?
21
✤ 文字列の検索(さっきと同じ問題)がO(m log n)で

解ける.場合によってはローリングハッシュよりも

高速に解ける.
✤ LCP Array(Longest Common Prefix Array)との

組み合わせで繰り返し出現する部分文字列を見つける
ことができる.(他にもいろいろできるっぽい)
記号の説明
✤ 接尾辞配列のO(n(log n)2)時間構築アルゴリズムを

紹介する.
✤ S[i, k]:文字列Sのi文字目からk文字の部分文字列
✤ rankk(i):S[i, k]がすべてのk文字の部分文字列を

ソートした時に何番目に小さいか
22
接尾辞配列の構築
✤ 基本的なアイディアはダブリングである.
✤ rankk(i)とrank2k(i)のペアをソートすることでi文字
目からi + 2k文字目まではソートされる
✤ rankのソートをlog n回行うことでO(n (log n)2)で

構築可能
23
接尾辞配列の構築
24
sa[i] S[sa[i], 2] S[sa[i], 4] rank2(sa[i]) rank2(sa[i] + 2)
11 emp emp 0 -1
10 a a 1 -1
0 ab abra 2 8
7 ab abra 2 8
3 ac acad 3 4
5 ad adab 4 2
1 br bra 5 1
最新の接尾辞配列の構築法
✤ SA-ISという手法で線形時間構築が可能!

(俺には理解できませんでした.)
25

More Related Content

PDF
プログラミングコンテストでの乱択アルゴリズム
PDF
Union find(素集合データ構造)
PDF
Rolling Hashを殺す話
PDF
色々なダイクストラ高速化
PDF
直交領域探索
PDF
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでの乱択アルゴリズム
Union find(素集合データ構造)
Rolling Hashを殺す話
色々なダイクストラ高速化
直交領域探索
プログラミングコンテストでのデータ構造 2 ~動的木編~

What's hot (20)

PDF
最小カットを使って「燃やす埋める問題」を解く
PDF
様々な全域木問題
PDF
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
PDF
プログラミングコンテストでのデータ構造
PPTX
AtCoder Beginner Contest 012 解説
PDF
ウェーブレット木の世界
PDF
双対性
PDF
競技プログラミングにおけるコードの書き方とその利便性
PDF
プログラミングコンテストでの動的計画法
PPTX
2SAT(充足可能性問題)の解き方
PDF
Abc009
PDF
AtCoder Regular Contest 037 解説
PDF
Re永続データ構造が分からない人のためのスライド
PDF
ダブリング
PDF
平面グラフと交通ネットワークのアルゴリズム
PDF
abc027
PDF
ユークリッド最小全域木
最小カットを使って「燃やす埋める問題」を解く
様々な全域木問題
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造
AtCoder Beginner Contest 012 解説
ウェーブレット木の世界
双対性
競技プログラミングにおけるコードの書き方とその利便性
プログラミングコンテストでの動的計画法
2SAT(充足可能性問題)の解き方
Abc009
AtCoder Regular Contest 037 解説
Re永続データ構造が分からない人のためのスライド
ダブリング
平面グラフと交通ネットワークのアルゴリズム
abc027
ユークリッド最小全域木
Ad

More from HCPC: 北海道大学競技プログラミングサークル (20)

PDF
ACPC 2017 Day3 F: 掛け算は楽しい
PDF
ACPC 2019 Day3 F: 部分文字列分解
PDF
ACPC 2019 Day3 E: 総和の切り取り
PDF
HUPC 2019 Day1 F: グリッドの番号
PDF
HUPC 2019 Day1 E: 最短経路の復元
PDF
PDF
プログラミングコンテスト基礎テクニック
ACPC 2017 Day3 F: 掛け算は楽しい
ACPC 2019 Day3 F: 部分文字列分解
ACPC 2019 Day3 E: 総和の切り取り
HUPC 2019 Day1 F: グリッドの番号
HUPC 2019 Day1 E: 最短経路の復元
プログラミングコンテスト基礎テクニック
Ad

Rolling hash