【寒假复健Day4】字符串匹配(上)—— 字符串哈希

字符串匹配 - 字符串哈希

导航:

  • 字符串哈希
  • 有限状态自动机
  • 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 mn 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 nm+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×kn1+S2×kn2++Sn×k0=i=1nSi×kni
其中 S S S表示某一字符串, S i S_i Si表示该字符串第 i i i个字符所对应的值。

显然,要避免冲突,使每个字符串产生唯一的值,每个字符串映射至的值应该唯一且小于进制数 k k

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值