第十一章 数据结构 串的模式匹配 BF算法 + KMP算法

串的模式匹配

设有主串s和子串t, 子串t的定位就是要在s中找到一个与子串相等的子串。
通常把主串s称为目标串, 把子串t称为模式串, 因此定位也称作模式匹配。
在目标串s中找到一个模式串t, 称为模式匹配成功。
在目标串s中找到一个模式串t, 称为模式匹配不成功。

Brute-Force算法

Brute-Force算法简称为BF算法, 亦称为简单匹配算法。
这个算法又称为暴力匹配。
假设我们用i和j分别代表主串与模式串当前比较的位置,如果当前匹配成功, 则i++,j++;若失败, 则两个指针都要回溯。
i = i - j + 2, j则是从头开始。

BF算法在最好的情况下是 O ( m ) O(m) 的复杂度, 即主串的前m个字符正好等于模式串的m个字符。
在最坏的情况下时间复杂度为 O ( n m ) O(n * m)

KMP算法

KMP算法是由
D. E. Knuth、J.H.Morris和V.R.Pratt共同提出的算法, 简称KMP算法。
该算法较BF算法有较大的改进, 主要是消除了主串指针的回溯, 从而使算法效率有了某种程度的提高。

在KMP算法中, 通过分析模式串t从中提取出隐藏的加速匹配的有用信息, 利用它来提高模式匹配的效率。

采用next数组存放这些“部份匹配”信息。
t = “ababb” t4前面:t0t1 = t2t3;
在这里插入图片描述
记住, 一定要是t的开头部份。
比如abaaabc 此时字符c前面有两个与t开头部份相同的字符。那么next[i] = 2;i是c的下标。假设有多个这样相同的情况,则我们取最大的。

Next例:

在这里插入图片描述

在KMP算法中求next数组的时间复杂度为 O ( m ) O(m) ,在后面的匹配中因主串s的下标不减即不回溯, 比较次数可记为n,所以KMP算法的总时间复杂度为 O ( n + m ) O(n + m)

发布了370 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43960370/article/details/105541877
今日推荐