众所周知,KMP算法是模式匹配中一个最为经典的算法,然而它也是一个极为复杂的算法。
我TM搞了半天也搞不懂是个什么掉意思。QNM。
又学习到一个Sunday算法,易懂又高效。
在说Sunday算法之前,我们先说说它的前身Horspool算法。
这个算法的理念是
1.比较模式串和目标串时,不是传统的从左向右比较,而是从右向左比较。
2.遇到mismatch时,寻找mismatch的那个字符在模式串中的位置,并将模式串移动。
例子:
匹配串:abcbc sdxzcxx
模式串:cbcac
这个时候我们从右向左进行对暗号,c-c ,恩对上了,第二个b-a ,不对啊,我们应该怎么办?难道就这么放弃么。于是,模式串从不匹配的那个字符开始从右向左寻找匹配串中不匹配的字符b 的位置,结果发现居然有,赶快对上赶快对上,别耽误了。
匹配串:abcbcsd xzcxx
模式串: cbcac
然后继续从最右边的字符从右向左进行比较。这时候,我们发现了,d-c 不匹配啊,而且模式穿里面没有噢,没办法,只好移动一个模式串长度的单位了。
匹配串:abcbcsdxzcxx
模式串: cbcac
而Sunday算法在此基础上做了一点改进,即如果出现mismatch,直接找下一个字符在模式串中的位置。废话不多说,上例子
匹配串:abcbc zdxzc
模式串:zbcac
恩,这里我们看到b-a 没有对上,我们就看匹配串中的z 在模式串的位置,然后,嘿嘿。
匹配串:abcbczdxzc
模式串: zbcac
如果模式串中的没有那个字符怎么办呢?很简单,跳过去呗。
匹配串:abcbc edxzcs
模式串:zbcac
e 不在模式串中出现
那么我们就
匹配串:abcbcedxzcs
模式串: zbcac