大量的数据做字符串匹配_数据结构与算法之美 | 字符串匹配算法原理讲解(Hash、KMP、BM、Sunday)...

  • 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

1. 字符串Hash

字符串Hash就是在字符串上进行哈希,可通俗理解为把字符串转为整数,最后构建理想状态下的一个整数对应一个字符串的单射。
给定一个字符串S,我们规定:

f1771ca34f853ee4c770b21d0803fd55.png

1.1 自然溢出法

自然溢出Hash公式为:

8baf6f52c7f0c3b51131deb1d88e51ca.png

这里的hash数组利用了unsigned long long的自然溢出对(2^{64} - 1)(264−1)取模。

1.2 单Hash法

单hash公式为:

c9f95362ad75590f5b13a3707391def3.png


其中p和mod均为素数,且p<mod,为了降低hash冲突,可让p和mod尽量往大取。

当一个哈希值对应两个或多个字符串时出现哈希冲突

取素数可以有效避免冲突,可以参照以下例子:
设函数表达式为f(y, x) = yx mod N
当N = 8,y = 2时:

2ab8e1618e48e1f55d5453e212a5d0e5.png

当N = 7,y = 2时:

325b078eb2b80a5453ba72efbe7be35b.png

可以看出取素数冲突变少了。

1.3 双Hash法

将一个字符串用不同的mod hash两次,再将两个结果用一个二元组表示,构成一个

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​

可以得出:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值