- 0.引言
- 1. 字符串Hash
- 1.1 自然溢出法
- 1.2 单Hash法
- 1.3 双Hash法
- 1.4字符串hash的获取
- 2. KMP
- 3. BM
- 3.1 坏字符串规则
- 3.2 好后缀规则
- 4. Sunday
0.引言
字符串的定位操作通常称作字符串的模式匹配,是各种字符串处理系统中最重要的操作之一,本文介绍Hash、KMP、BM、Sunday四种匹配算法。
![88befafd97769ba15c3cf7f4f1e1b1aa.png](https://img-blog.csdnimg.cn/img_convert/88befafd97769ba15c3cf7f4f1e1b1aa.png)
1. 字符串Hash
字符串Hash就是在字符串上进行哈希,可通俗理解为把字符串转为整数,最后构建理想状态下的一个整数对应一个字符串的单射。
给定一个字符串S,我们规定:
![f1771ca34f853ee4c770b21d0803fd55.png](https://img-blog.csdnimg.cn/img_convert/f1771ca34f853ee4c770b21d0803fd55.png)
1.1 自然溢出法
自然溢出Hash公式为:
![8baf6f52c7f0c3b51131deb1d88e51ca.png](https://img-blog.csdnimg.cn/img_convert/8baf6f52c7f0c3b51131deb1d88e51ca.png)
这里的hash数组利用了unsigned long long的自然溢出对(2^{64} - 1)(264−1)取模。
1.2 单Hash法
单hash公式为:
![c9f95362ad75590f5b13a3707391def3.png](https://img-blog.csdnimg.cn/img_convert/c9f95362ad75590f5b13a3707391def3.png)
其中p和mod均为素数,且p<mod,为了降低hash冲突,可让p和mod尽量往大取。
当一个哈希值对应两个或多个字符串时出现哈希冲突
取素数可以有效避免冲突,可以参照以下例子:
设函数表达式为f(y, x) = y∗x mod N
当N = 8,y = 2时:
![2ab8e1618e48e1f55d5453e212a5d0e5.png](https://img-blog.csdnimg.cn/img_convert/2ab8e1618e48e1f55d5453e212a5d0e5.png)
当N = 7,y = 2时:
![325b078eb2b80a5453ba72efbe7be35b.png](https://img-blog.csdnimg.cn/img_convert/325b078eb2b80a5453ba72efbe7be35b.png)
可以看出取素数冲突变少了。
1.3 双Hash法
将一个字符串用不同的mod hash两次,再将两个结果用一个二元组表示,构成一个
![156a88f60c6a2b9c575be2a46c2674d2.png](https://img-blog.csdnimg.cn/img_convert/156a88f60c6a2b9c575be2a46c2674d2.png)
1.4 字符串hash的获取
根据定义可以得出:
hash[1]=s_1hash[1]=s1
hash[2]=s_1times p+s_2hash[2]=s1×p+s2
hash[3]=s_1times p^2+s_2times p+s_3hash[3]=s1×p2+s2×p+s3
hash[4]=s_1times p^3+s_2times p^2+s_3times p+s_4hash[4]=s1×p3+s2×p2+s3×p+s4
又由
hash[3,4]=s_3times p+s_4hash[3,4]=s3×p+s4
hash[4]=s_1times p^3+s_2times p^2+s_3times p+s_4hash[4]=s1×p3+s2×p2+s3×p+s4
hash[2]=s_1times p+s_2hash[2]=s1×p+s2
可以得出: