字符串匹配 - 字符串哈希
导航:
- 字符串哈希
- 有限状态自动机
- KMP
匹配
给定一个长为 n n n的文本串 T [ 1.. n ] T[1..n] T[1..n]与一个长为 m m m的模式串 M [ 1.. m ] M[1..m] M[1..m],其中 m ≤ n m\leq n m≤n, T T T与 M M M的字符来自同一个字符集 Σ \Sigma Σ。寻找在 T T T中的所有有效偏移 s s s,使得 T [ s + 1.. s + m ] = P [ 1.. m ] T[s+1..s+m]=P[1..m] T[s+1..s+m]=P[1..m],则称字符串匹配。
显然,有效偏移 s s s的位置有 n − m + 1 n-m+1 n−m+1个,若 m > n m>n m>n则无有效偏移,此时讨论字符串匹配无意义,或者说必为 0 0 0。
当然,字符串匹配不仅仅局限于字符串,将字符抽象为任意元素,字符集抽象为任意元素对应的集合,只需元素之间能够判断是非等同,亦可进行匹配。
字符串哈希
求其值
我们将每个字符视为一个值,整个字符串视为一个 k k k进制表示。比如十六进制下, B 16 = 1 1 10 B_{16}=11_{10} B16=1110,而 A B 16 = 171 10 AB_{16}=171_{10} AB16=17110,我们将每个字符映射至一个值,整个字符串视为一个 k k k进制表示,则可以轻松计算出 T T T与 P P P的“值”,匹配问题就成了在 T T T中是否有连续的 m m m位数位与 P P P相同。我们将这个将字符串映射为一个唯一的值的函数,定义为 f f f。
f ( S ) = S 1 × k n − 1 + S 2 × k n − 2 + ⋯ + S n × k 0 = ∑ i = 1 n S i × k n − i f(S)=S_1\times k^{n-1}+S_2\times k^{n-2}+\cdots+S_n\times k^0=\sum_{i=1}^nS_i\times k^{n-i} f(S)=S1×kn−1+S2×kn−2+⋯+Sn×k0=i=1∑nSi×kn−i
其中 S S S表示某一字符串, S i S_i Si表示该字符串第 i i i个字符所对应的值。
显然,要避免冲突,使每个字符串产生唯一的值,每个字符串映射至的值应该唯一且小于进制数 k k