Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
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文字の部分文字列を

ソートした時に何番目に...
接尾辞配列の構築
✤ 基本的なアイディアはダブリングである.
✤ rankk(i)とrank2k(i)のペアをソートすることでi文字
目からi + 2k文字目まではソートされる
✤ rankのソートをlog n回行うことでO(n (log n)...
接尾辞配列の構築
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 abr...
最新の接尾辞配列の構築法
✤ SA-ISという手法で線形時間構築が可能!

(俺には理解できませんでした.)
25
Prochain SlideShare
Chargement dans…5
×

Rolling hash

1 944 vues

Publié le

ローリングハッシュとサフィックスアレイ

Publié dans : Technologie
  • Soyez le premier à commenter

Rolling hash

  1. 1. 2015/06 ローリングハッシュと Suffix Array 北海道大学 情報知識ネットワーク研究室 情報理工学専攻 修士 1年 栗田 和宏 1
  2. 2. 部分文字列検索 ✤ テキストT:検索する文字列
 テキスト長をnとする. ✤ パターンP:見つけたい文字列
 パターン長をmとする. ✤ 自明な方法:O(nm) 2
  3. 3. ナイーブな部分文字列検索 ✤ テキスト:abracadabra
 パターン:abr 3 abracadabra abr
  4. 4. ナイーブな部分文字列検索 ✤ テキスト:abracadabra
 パターン:abr 4 abracadabra abr
  5. 5. ナイーブな部分文字列検索 ✤ テキスト:abracadabra
 パターン:abr 5 abracadabra abr
  6. 6. ナイーブな部分文字列検索 ✤ テキスト:abracadabra
 パターン:abr 6 abracadabra abr
  7. 7. ナイーブな部分文字列検索 ✤ テキスト:abracadabra
 パターン:abr 7 abracadabra abr この方法では部分文字列検索に
 O(nm)時間かかる
  8. 8. 高速な文字列検索 ✤ ローリングハッシュを使おう! ✤ 文字列を値にするハッシュ関数を用いて値が一致した 時に文字列が一致したとする. 8
  9. 9. 高速な文字列検索 ✤ ローリングハッシュを使おう! ✤ 文字列を値にするハッシュ関数を用いて値が一致した 時に文字列が一致したとする. ✤ その前にハッシュとは何か知っていますか? 9
  10. 10. ハッシュとは? 10 https://ja.wikipedia.org/wiki/%E3%83%8F %E3%83%83%E3%82%B7%E3%83%A5%E9%96%A2%E6%95%B0
  11. 11. ローリングハッシュ ✤ 文字1文字を値とし,その値と基数の積の総和をハッ シュ値とするハッシュ関数を使う. 11
  12. 12. ローリングハッシュ ✤ 文字1文字を値とし,その値と基数の積の総和をハッ シュ値とするハッシュ関数を使う. 12 abr = 1*10^2 + 2*10^1 + 5*10^0
 = 125 a = 1, b = 2, r = 5, 基数:10
  13. 13. ハッシュ値の計算 ✤ 愚直にハッシュ値を毎回計算するとハッシュ値の計算 にO(m)時間かかり,結局O(nm)時間かかってしまう. 13
  14. 14. ハッシュ値の計算 ✤ 愚直にハッシュ値を毎回計算するとハッシュ値の計算 にO(m)時間かかり,結局O(nm)時間かかってしまう. ✤ なので,ローリングしながらハッシュ値を計算するこ とで毎回のハッシュ値計算をO(1)時間にする. 14
  15. 15. ハッシュ値の計算 15 abracadabra 125 abra = 125
  16. 16. ハッシュ値の計算 16 abracadabra 251 abra = 125
  17. 17. ハッシュ値の計算 17 abracadabra 513 abra = 125
  18. 18. ハッシュ値の計算 18 abracadabra 513 1つ前のハッシュ値に基数をかけ,新しい
 文字に対応する値を足し,先頭文字に対応
 する値を引く. abra = 125
  19. 19. 接尾辞配列(Suffix array) 19 ✤ 文字列のある場所から末尾までの文字列を接尾辞
 という. ✤ 1つの文字列のすべての接尾辞を辞書順にソートした ものを接尾辞配列という. ✤ 自明にO(n2log n)で作れる.
  20. 20. 接尾辞配列の例 20 ✤ abracadabraの接尾辞配列

  21. 21. 接尾辞配列で何ができるか? 21 ✤ 文字列の検索(さっきと同じ問題)がO(m log n)で
 解ける.場合によってはローリングハッシュよりも
 高速に解ける. ✤ LCP Array(Longest Common Prefix Array)との
 組み合わせで繰り返し出現する部分文字列を見つける ことができる.(他にもいろいろできるっぽい)
  22. 22. 記号の説明 ✤ 接尾辞配列のO(n(log n)2)時間構築アルゴリズムを
 紹介する. ✤ S[i, k]:文字列Sのi文字目からk文字の部分文字列 ✤ rankk(i):S[i, k]がすべてのk文字の部分文字列を
 ソートした時に何番目に小さいか 22
  23. 23. 接尾辞配列の構築 ✤ 基本的なアイディアはダブリングである. ✤ rankk(i)とrank2k(i)のペアをソートすることでi文字 目からi + 2k文字目まではソートされる ✤ rankのソートをlog n回行うことでO(n (log n)2)で
 構築可能 23
  24. 24. 接尾辞配列の構築 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
  25. 25. 最新の接尾辞配列の構築法 ✤ SA-ISという手法で線形時間構築が可能!
 (俺には理解できませんでした.) 25

×