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

文章跳转
👉数据结构-串和数组(一)串的基本概念
👉数据结构-串和数组(二)BF算法

本文详细介绍了KMP的算法思想以及计算next数组的两种算法,分别是手动移位模拟法和前后缀及算法,以及KMP算法优化nextval数组的计算方法。Let’s go!🏃‍♂️

数据结构-串和数组(三)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数组值

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值