算法导论—字符串匹配

华电北风吹
天津大学认知计算与应用重点实验室
最后修改日期:2016/1/4

本文说说我对几个常用的字符串匹配算法的理解。
字符串匹配问题是指对于一个长度为n的文本数组T[n],检测长度为m的模式文本数组P[m]在T中出现的位置。常见的方法有朴素算法,Rabin-Karp算法,有限自动机算法,KMP(Knuth-Morris-Pratt)算法和Boyer-Moor(BM)算法。

一、朴素算法
朴素算法不需要对模式进行预处理,直接用模式在文本数组上二层循环匹配(外层对模式逐个偏移,内层进行逐个匹配)。时间复杂度为O((n-m+1)m)。
此方法比较简单,不详细叙述。

二、Rabin-Karp算法

三、有限自动机算法

四、KMP算法
KMP算法基本思路也是通过对模式在文本数组上偏移匹配。巧妙的是KMP已经匹配过的模式可以用来挖掘匹配字符串的信息使得每个匹配字符串只匹配一次来提高效率。KMP对模式进行预处理时间复杂度O(m),匹配时间复杂度O(n)。总的来说KMP时间复杂度为O(m+n)。

五、BM算法
BM是一种比KMP更为高效的算法。目前文本处理软件(office)里面的查找功能就是使用的BM算法。KMP已经展示了可以通过预处理极大提高匹配效率,BM算法进一步提高预处理功能。BM算法通过预先计算生成《坏字符规则表》和《好后缀规则表》来提高匹配效率。
BM算法引入了”坏字符(bad character)”的概念。在匹配的过程中通过”坏字符规则”和”好后缀规则”来对文本数组进行匹配。
“坏字符规则—后移位数 = 坏字符的位置 - 搜索词中的上一次出现位置
“好后缀规则”—后移位数 = 好后缀的位置 - 搜索词中的上一次出现位置

参考资料:
1、算法导论(第三版)
2、字符串匹配的KMP算法
3、字符串匹配的Boyer-Moore算法

你可能感兴趣的:(算法导论—字符串匹配)