KMP

本文深入解析KMP算法的工作原理及优化之处,通过对比BF算法,阐述KMP算法如何利用NEXTS数组来加速字符串匹配过程,并解释NEXTS数组的构建方法及其在匹配失配时的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.求NEXTS数组
?NEXTS数组中存放的是最长前缀的结尾
A.前面没有字符串,默认为-1
B.前缀不能要最后一个字符且 后缀不能要第一个字符,规定为0
C.剩下点按照:前缀长度和后缀长度的最大匹配

在这里插入图片描述
2.nexts[]中的前缀长度和后缀长度的匹配问题
A.前缀是从前向后数不包含最后一个,后缀从后向前数不包含第一个
B.前缀最大长度不能包含最后该串的最后一个字符,后缀最大长度不能包含该串的第一个字符,否则就是自己和自己相等

3.为什么[j4,j3] == [i1,i]?
i和j代表失配的位置,j2的代表最长后缀的开头,j3代表最长后缀的的结尾
[i1,i] == [j2,j]是因为在x和y才失配,x和y之前所有都是相等的。而[j4,j3] == [j2,j],这是根据nexts[]求法是:前缀长度和后缀长度的最大匹配。根据传递性则‘<==>’两块区域是相等。

4.当失配时,为什么要从J—>J3/J=nexts[J];?
首先nexts[]中存放的是最长前缀的结尾,在该例子中nexts[J] == J3
假设将J–>J4 &&I–>I1,由于[j4,j3 ]== [i1,i](上个问题已证),那么就可以从J4–>J3 && i1–>i,这样就是i不动,将J—>J3

5.在BF算法中,主串后移一位,子串归0,那么在KMP中可以让子串归0么?
可以让子串归0
KMP中J–>J3&&I不动,要让子串归0即I–>I1,那么将J–>J4即可

6.为什么在KMP算法中可以加速匹配的速度?
BF中,主串后移1个位置,子串归0
KMP中可以让子串归0(5中已经证明),那么主串就移动到了i1
在BF中主串后移了1个位置,KMP中子串后移了[0,i1]

7.为什么在求nexts[]时,要前缀长度和后缀长度的最大匹配?
(J-J2)越大,(i-i1)就越大,也就是i1离str1开头的位置越近,这样就不会错过可能匹配上的点

8.getNexts与KMP的比较
相同:KMP的本质是尽可能多的匹配字符,getNexts的本质是让前缀和后缀尽可能的长
不同:KMP是两个串,getNexts是一个串,可以将getNexts中的串看成两个串
?由于二者本质相同所以代码相同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值