0%

数据结构-串和数组(三)KMP算法

数据结构-串和数组(三)KMP算法

1、算法思想

由D.E.Knuth,J.H.Morris和V.R.Pratt提出,因此称为 KMP算法;

根据模式串T,求出 next 数组。利用next数组进行匹配(主串指针不回溯)next数组只和短短的模式串有关,和长长的主串无关

2、复杂度分析

时间复杂度:

KMP算法, 最坏时间复杂度 O(m+n)
其中,求 next 数组时间复杂度 O(m)
模式匹配过程最坏时间复杂度 O(n)

3、 next数组求解

next数组的作用:当模式串的第 j 个字符失配时,从模式串的第 next[j] 的继续往后匹配

1、手动移位模拟法

next[1] 都⽆脑写 0

next[2] 都⽆脑写 1

其他 next: 在不匹配的位置前,划⼀根美丽的分界线;模式串⼀步⼀步往后退,直到分界线之前“能对上”,或模式串完全跨过分界线为⽌。

此时 j 指向哪⼉, next数组值就是多少;

2、前后缀计算法

next[j] = 字符串的前缀和后缀的最长相等前后缀长度 + 1

4、 KMP算法优化

先得出next数组,然后从头开始遍历

1、先找对应的next[next[j]]

2、判断该字符是否相等

3、相等,则nextval[j] = next[next[j]],即等于找到的next数组值

4、不相等,则nextval[j] = next[j],即等于自身next数组值

北以晨光 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
------ 本文结束感谢您的阅读 ------