最近看了一些匹配算法,发现其实算法也不是很高深,也还是要一个个匹配字符嘛,就是在一个个匹配基础上想一些法子提升性能和优化。
下面列出一些常用匹配算法:
图1 字符串常用匹配算法
单模式匹配是指一次操作只能判断待匹配序列是否和某一个模式匹配。
多模式匹配是指一次操作能判断待匹配序列是否和多个模式匹配。
单模式匹配:
KMP算法
a 0 a 1... a j-1 a j
要找到一个k,使它满足
a 0 a 1... a k-1 a k= a j-k a j-k+1... a j-1 a j
比如下面的序列,
在红色部分失配,正确的结果是k=1的情况,把pattern右移4位,如果选择k=0,右移5位则会产生错误。
计算这个overlay函数的方法可以采用递推,可以想象如果对于pattern的前j个字符,如果覆盖函数值为k
a0a1...ak-1ak=aj-kaj-k+1...aj-1aj
则对于pattern的前j+1序列字符,则有如下可能
⑴ pattern[k+1]==pattern[j+1] 此时overlay(j+1)=k+1=overlay(j)+1
⑵ pattern[k+1]≠pattern[j+1] 此时只能在pattern前k+1个子符组所的子串中找到相应的overlay函数,h=overlay(k),如果此时pattern[h+1]==pattern[j+1],则overlay(j+1)=h+1否则重复(2)过程.
匹配过程
当发生在j长度失配时,只要把pattern向右移动j-overlay(j)长度就可以了。
BM算法
Horspool算法
具体参看wiki:http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore%E2%80%93Horspool_algorithm
首先,要构造失配时模式串中元素的移动距离数组d。即某个
Sunday算法
百度百科中很详细了:http://baike.baidu.com/view/6325831.htm
如下面的例子:
目标串:abcdefghijk
模式串:aabcc
模式串中b只出现了一次,a,c都出现了2次,所以我们可以先比较b所在的位置(只看模式串中的字符的话,b失配的概率会比较大)