Bootstrap

数据结构_KMP算法与KMP算法的优化

朴素模式匹配算法的缺点:

当某些子串与模式串能部分匹配时,主串的扫描指针i经常回溯,导致时间开销增加

寻找 “google” 模板
在这里插入图片描述

解决:
改进思路- -

KMP算法

主串指针不回溯,只有模式串指针回溯。

所以不同的模式串对应不同的表。
在这里插入图片描述


观察:求模式串的next数组。

next数组:当模式串的第j个字符匹配失败时,令模式串跳到next[j]再继续匹配。

在这里插入图片描述
串的前缀:包含第一个字符,且不包含最后一个字符的子串。

串的后缀:包含最后一个字符,且不包含第一个字符的子串。

当j个字符匹配失败,由前1~j-1个字符组成的串记为S,则:next[j] = S的最长相等前后缀长度+1

练习一

在这里插入图片描述

练习二

在这里插入图片描述
在这里插入图片描述
所以KMP算法的平均时间复杂度:O(n+m)
朴素模式匹配算法的缺点:最坏的时间复杂度O(nm)

KMP算法的优化:

在这里插入图片描述

多加了一个nextval[j]数组、
在这里插入图片描述
KMP算法优化:当子串和模式串不匹配时 j = nextval[j]

;