Struct nekolib::seq::kmp::KmpSearcher
source · pub struct KmpSearcher<T: Eq> { /* private fields */ }
Expand description
KMP 法 (Knuth–Morris–Pratt algorithm)。
文字列 $S$ を入力とする。 各 $S[\dots i]$ ($0\le i\le |S|$) の最長 border と最長 tagged border の長さを求める。該当する border が存在しない要素は $-1$ とする。
文字列 $S[\dots i]$ の border とは、$S[\dots i]$ の真部分文字列であり、$S[\dots i]$ の接頭辞かつ接尾辞であるような文字列である。
文字列 $S[\dots i]$ の border $S[\dots j]$ ($0\le j < i$) が $S[j] \neq S[i]$ を満たすとき、$S[\dots j]$ は $S[\dots i]$ の tagged border (strict border, strong border) であると言う。ただし、$S[|S|]$ は $S$ 中に含まれない文字として定義する。
0 1 2 3 4 5 6 7 8 9 ...
+-------------------+-------+
S | a a b a c a a b a | c ... |
+-------------------+-------+
この例において、$S[\dots 4] = \mathtt{aaba}$ は $S[\dots 9] = \mathtt{aabacaaba}$ の border だが tagged border ではない ($S[4] = S[9] = \mathtt{c}$)。一方、 $S[\dots 2] = \mathtt{aa}$ は tagged border である ($S[2] = \mathtt{b} \neq S[9] = \mathtt{c}$)。
この tagged border を用いることで、パターン検索を高速に行う。
Idea
tagged border を $O(|S|)$ 時間で求める方法と、パターン検索を $O(|T|)$ 時間で行う方法について書く。
Implementation notes
パターンが静的な場合であれば最長 border を求める必要はない。 パターンの末尾に対する push のみを考慮する場合も同様のはず。 ここではパターンの末尾に対する pop を行える実装になっており、その更新の際には最長 border の長さが必要になるはず。
Complexity
構築は $O(|S|)$ 時間。パターン末尾における更新は $O(\log(|S|))$ 時間。 ただし、末尾への追加はこれに worst $O(|S|)$ (amortized $O(1)$) 時間が加わる。
References
- Knuth, D. E., Morris, Jr, J. H., & Pratt, V. R. (1977). Fast pattern matching in strings. SIAM journal on computing, 6(2), 323-350.
See also
Implementations§
source§impl<T: Eq> KmpSearcher<T>
impl<T: Eq> KmpSearcher<T>
pub fn occurrences<'a>(&'a self, s: &'a [T]) -> Occurrences<'a, T> ⓘ
Trait Implementations§
source§impl<T: Clone + Eq> Clone for KmpSearcher<T>
impl<T: Clone + Eq> Clone for KmpSearcher<T>
source§fn clone(&self) -> KmpSearcher<T>
fn clone(&self) -> KmpSearcher<T>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl<T: PartialEq + Eq> PartialEq<KmpSearcher<T>> for KmpSearcher<T>
impl<T: PartialEq + Eq> PartialEq<KmpSearcher<T>> for KmpSearcher<T>
source§fn eq(&self, other: &KmpSearcher<T>) -> bool
fn eq(&self, other: &KmpSearcher<T>) -> bool
self
and other
values to be equal, and is used
by ==
.