Boyer-Moore-Horspool 算法(出现启发式规则)

字符串匹配的顺序既能从头到尾,也能从尾到头。从尾到头的叫做朴素逆向匹配算法。可以参考一下这篇文章

朴素逆向匹配算法

但是单纯的正向或是逆向朴素匹配并没有改变算法执行的时间。都是O(m*n)

显然如果只是朴素逆向匹配并没有实际意义,所以Horspool提出了出现启发式规则。所谓的出现启发式规则是:

在不匹配发生之后,将T[s + m–1]对齐到模式 P[0..m–2]中的最右匹配的位置, 如果没有匹配的字符,将P向右移动m个位置。

通俗来说就是,如果模式串与主串不匹配,则在模式串除了最后一个字符的剩余字符串中,从后往前找到与模式串最后一个字符对应的主串字符相同的字符,并将这两个字符对齐。

如:

Tdadata
Pdata
Pdata

在第一次匹配中,主串T与模式串P发生了不匹配,此时模式串的最后一个字符为P[3]对应的主串字符为T[3],故在模式串除最后一个字符外的剩余字符串P[0-2]中从后往前找到与T[3]相同的字符,为P[1]。将P[1]与T[3]对齐,可以发现匹配成功了。

但是如果没有找到相同的字符呢?

如:

Tdadedata
Pdata
Pdata

可以看出此时P[0-2]中并没有与T[3]相同的字符。此时就将模式串整个向右移动m个位置,m为模式串的长度。

再来一道题练习一下

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Silwan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值