数据结构学习笔记——KMP算法中的常见计算题目总结

简介: 数据结构学习笔记——KMP算法中的常见计算题目总结

例题1


例、求串’abaabc’的next数组值__________。


答:首先设next[1]=0,next[2]=1(要注意这里的数组是从1开始的,而不是0),如下表:

编号 1 2 3 4 5 6
S a b a a b c
next 0 1



当j=3时,k=next[j-1]=next[2]=1,

此时看S[j-1]=S[2]='b’与S[k]=S[1]='a’是否相等,

由于不相等,所以继续向前查找next值对应的字符来与前一位进行比较,由于通过查找至第一位仍未找到相等的字符,直接将其赋值,即next[j]=next[3]=1;

编号 1 2 3 4 5 6
S a b a a b c
next 0 1 1



当j=4时,k=next[j-1]=next[3]=1,

此时看S[j-1]=S[3]='a’与S[k]=S[1]='a’是否相等,

由于相等,即直接next[j]=next[4]=k+1=1+1=2;

编号 1 2 3 4 5 6
S a b a a b c
next 0 1 1 2



当j=5时,k=next[j-1]=next[4]=2,

此时看S[j-1]=S[4]='a’与S[k]=S[2]='b’是否相等,

由于S[k]=S[2]='b’与其不相等,所以继续向前查找next值对应的字符来与前一位进行比较,S[2]对应的next值为1,寻找S[1],找到编号为1的字符,即S[1]=‘a’,

此时比较S[j-1]=S[4]='a’与S[k]=S[1]='a’是否相等,

由于相等,且此时要注意是在第二位S[2]处实现的相等,即

next[j]=next[5]=next[2]+1=1+1=2;

编号 1 2 3 4 5 6
S a b a a b c
next 0 1 1 2 2



当j=6时,k=next[j-1]=next[5]=2,

此时看S[j-1]=S[5]='b’与S[k]=S[2]='b’是否相等,

由于相等,即直接next[j]=next[6]=k+1=2+1=3;

编号 1 2 3 4 5 6
S a b a a b c
next 0 1 1 2 2 3


故串’abaabc’的next数组值为011223。


例题2


例、串’ababaaababaa’的next数组值为__________,其next数组为__________。


答:首先设next[1]=0,next[2]=1(要注意这里的数组是从1开始的,而不是0),如下表:

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1



当j=3时,k=next[j-1]=next[2]=1,

此时看S[j-1]=S[2]='b’与S[k]=S[1]='a’是否相等,

由于不相等,所以继续向前查找next值对应的字符来与前一位进行比较,由于通过查找至第一位仍未找到相等的字符,直接将其赋值,即next[j]=next[3]=1;

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1


当j=4时,k=next[j-1]=next[3]=1,

此时看S[j-1]=S[3]='a’与S[k]=S[1]='a’是否相等,

由于相等,即直接next[j]=next[4]=k+1=1+1=2;

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1 2



当j=5时,k=next[j-1]=next[4]=2,

此时看S[j-1]=S[4]='b’与S[k]=S[2]='b’是否相等,

由于相等,即直接next[j]=next[5]=k+1=2+1=3;

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1 2 3



当j=6时,k=next[j-1]=next[5]=3,

此时看S[j-1]=S[5]='a’与S[k]=S[3]='a’是否相等,

由于相等,即直接next[j]=next[6]=k+1=3+1=4;

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1 2 3 4


 

当j=7时,k=next[j-1]=next[6]=4,

此时看S[j-1]=S[6]='a’与S[k]=S[4]='b’是否相等,

由于S[k]=S[4]='b’与其不相等,所以继续向前查找next值对应的字符来与前一位进行比较,S[4]对应的next值为2,寻找S[2],找到编号为2的字符,即S[2]=‘b’,

此时比较S[j-1]=S[6]='a’与S[k]=S[2]='b’是否相等,

发现依旧不相等,继续查找,S[2]对应的next值为1,寻找S[1],找到编号为1的字符,即S[1]=‘a’,

此时比较S[j-1]=S[6]='a’与S[k]=S[1]='a’是否相等,

由于相等,且此时要注意是在第二位S[2]处实现的相等,即

next[j]=next[7]=next[2]+1=1+1=2;

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1 2 3 4 2



当j=8时,k=next[j-1]=next[7]=2,

此时看S[j-1]=S[7]='a’与S[k]=S[2]='b’是否相等,

由于S[k]=S[2]='b’与其不相等,所以继续向前查找next值对应的字符来与前一位进行比较,S[2]对应的next值为1,寻找S[1],找到编号为1的字符,即S[1]=‘a’,

此时比较S[j-1]=S[7]='a’与S[k]=S[1]='a’是否相等,

由于相等,且此时要注意是在第二位S[2]处实现的相等,即

next[j]=next[8]=next[2]+1=1+1=2;

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1 2 3 4 2 2



当j=9时,k=next[j-1]=next[8]=2,

此时看S[j-1]=S[8]='b’与S[k]=S[2]='b’是否相等,

由于相等,即直接next[j]=next[9]=k+1=2+1=3;

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1 2 3 4 2 2 3



当j=10时,k=next[j-1]=next[9]=3,

此时看S[j-1]=S[9]='a’与S[k]=S[3]='a’是否相等,

由于相等,即直接next[j]=next[10]=k+1=3+1=4;

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1 2 3 4 2 2 3 4



当j=11时,k=next[j-1]=next[10]=4,

此时看S[j-1]=S[10]='b’与S[k]=S[4]='b’是否相等,

由于相等,即直接next[j]=next[11]=k+1=4+1=5;

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1 2 3 4 2 2 3 4 5


当j=12时,k=next[j-1]=next[11]=5,

此时看S[j-1]=S[11]='a’与S[k]=S[4]='b’是否相等,

由于相等,即直接next[j]=next[12]=k+1=5+1=6;

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1 2 3 4 2 2 3 4 5 6


故串’ababaaababaa’的next数组值为011234223456。


将next数组值整体左移一位,低位用-1填充,如下:

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next -1 0 0 1 2 3 1 1 2 3 4 5


故串’ababaaababaa’的next数组为-1,0,0,1,2,3,1,1,2,3,4,5。


例题3


例、已知字符串S=‘aabaabaabaac’,模式串P=‘aabaac’,求P的next数组值以及具体的KMP算法匹配过程。


答:首先设next[1]=0,next[2]=1(这里设数组是从1开始的,而不是0),如下表:

编号 1 2 3 4 5 6
S a a b a a c
next 0 1



当j=3时,k=next[j-1]=next[2]=1,

此时看S[j-1]=S[2]='a’与S[k]=S[1]='a’是否相等,

由于相等,即直接next[j]=next[3]=k+1=1+1=2;

编号 1 2 3 4 5 6
S a a b a a c
next 0 1 2



当j=4时,k=next[j-1]=next[3]=2,

此时看S[j-1]=S[3]='b’与S[k]=S[2]='a’是否相等,

由于S[k]=S[2]='a’与其不相等,所以继续向前查找next值对应的字符来与前一位进行比较,S[2]对应的next值为1,寻找S[1],找到编号为1的字符,即S[1]=‘a’,

此时比较S[j-1]=S[3]='b’与S[k]=S[1]='a’是否相等,

由于不相等,所以继续向前查找next值对应的字符来与前一位进行比较,由于通过查找至第一位仍未找到相等的字符,直接将其赋值,即next[j]=next[4]=1;

编号 1 2 3 4 5 6
S a a b a a c
next 0 1 2 1



当j=5时,k=next[j-1]=next[4]=1,

此时看S[j-1]=S[4]='a’与S[k]=S[1]='a’是否相等,

由于相等,即直接next[j]=next[5]=k+1=1+1=2;

编号 1 2 3 4 5 6
S a a b a a c
next 0 1 2 1 2


当j=6时,k=next[j-1]=next[5]=2,

此时看S[j-1]=S[5]='a’与S[k]=S[2]='a’是否相等,

由于相等,即直接next[j]=next[6]=k+1=2+1=3;

编号 1 2 3 4 5 6
S a a b a a c
next 0 1 2 1 2 3


可知当主串与模式串进行匹配时,当i=6,j=6时,发生失配,通过next数组值表,可知,next[6]=3,即此时主串当前位置与模式串的第三个字符进行比较,如下:

1667280692109.jpg

然后,发现当i=9,j=6时,又发生失配,如下:

1667280706465.jpg

最后匹配成功。


例题4


例、串’ababaaababaa’的nextval数组为___________。


答:可知next数组为:

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1 2 3 4 2 2 3 4 5 6


即串’ababaaababaa’的next数组值为011234223456,求nextval数组从0开始,且串的位序由1开始,

首先令nextval[1]=next[1]=0;

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1 2 3 4 2 2 3 4 5 6
nextval 0



从j=2开始进行求nextval数组,判断pj是否等于p(next[j]),若是则将nextval[j]替换为nextval[next[j]],若不是则nextval[j]=next[j]。


j=2时,p2=b,p(next[2])=p1=a,此时两者不相等,

nextval[2]=next[2]=1;

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1 2 3 4 2 2 3 4 5 6
nextval 0 1



j=3时,p3=a,p(next[3])=p1=a,此时两者相等,

将nextval[j]替换为nextval[next[j]],即nextval[3]=nextval[next[3]]=nextval[1]=0;

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1 2 3 4 2 2 3 4 5 6
nextval 0 1 0


j=4时,p4=b,p(next[4])=p2=b,此时两者相等,

将nextval[j]替换为nextval[next[j]],即nextval[4]=nextval[next[4]]=nextval[2]=1;

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1 2 3 4 2 2 3 4 5 6
nextval 0 1 0 1



j=5时,p5=a,p(next[5])=p3=a,此时两者相等,

将nextval[j]替换为nextval[next[j]],即nextval[5]=nextval[next[5]]=nextval[3]=0;

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1 2 3 4 2 2 3 4 5 6
nextval 0 1 0 1 0


j=6时,p6=a,p(next[6])=p4=b,此时两者不相等,

nextval[6]=next[6]=4;

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1 2 3 4 2 2 3 4 5 6
nextval 0 1 0 1 0 4



j=7时,p7=a,p(next[7])=p2=b,此时两者不相等,

nextval[7]=next[7]=2;

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1 2 3 4 2 2 3 4 5 6
nextval 0 1 0 1 0 4 2



j=8时,p8=b,p(next[8])=p2=b,此时两者相等,

将nextval[j]替换为nextval[next[j]],即nextval[8]=nextval[next[8]]=nextval[2]=1;

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1 2 3 4 2 2 3 4 5 6
nextval 0 1 0 1 0 4 2 1



j=9时,p9=a,p(next[9])=p3=a,此时两者相等,

将nextval[j]替换为nextval[next[j]],即nextval[9]=nextval[next[9]]=nextval[3]=0;

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1 2 3 4 2 2 3 4 5 6
nextval 0 1 0 1 0 4 2 1 0


j=10时,p10=b,p(next[10])=p4=b,此时两者相等,

将nextval[j]替换为nextval[next[j]],即nextval[10]=nextval[next[10]]=nextval[4]=1;

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1 2 3 4 2 2 3 4 5 6
nextval 0 1 0 1 0 4 2 1 0 1


j=11时,p11=a,p(next[11])=p5=a,此时两者相等,

将nextval[j]替换为nextval[next[j]],即nextval[11]=nextval[next[11]]=nextval[5]=0;

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1 2 3 4 2 2 3 4 5 6
nextval 0 1 0 1 0 4 2 1 0 1 0



j=12时,p12=a,p(next[12])=p6=a,此时两者相等,

将nextval[j]替换为nextval[next[j]],即nextval[12]=nextval[next[12]]=nextval[6]=4;

编号 1 2 3 4 5 6 7 8 9 10 11 12
S a b a b a a a b a b a a
next 0 1 1 2 3 4 2 2 3 4 5 6
nextval 0 1 0 1 0 4 2 1 0 1 0 4


可得,故串’ababaaababaa’的nextval数组为0,1,0,1,0,4,2,1,0,1,0,4。


相关文章
|
2月前
|
算法 机器人
基于SOA海鸥优化算法的PID控制器最优控制参数计算matlab仿真
本课题研究基于海鸥优化算法(SOA)优化PID控制器参数的方法,通过MATLAB仿真对比传统PID控制效果。利用SOA算法优化PID的kp、ki、kd参数,以积分绝对误差(IAE)为适应度函数,提升系统响应速度与稳定性。仿真结果表明,SOA优化的PID控制器在阶跃响应和误差控制方面均优于传统方法,具有更快的收敛速度和更强的全局寻优能力,适用于复杂系统的参数整定。
|
6月前
|
算法 JavaScript 数据安全/隐私保护
基于GA遗传优化的最优阈值计算认知异构网络(CHN)能量检测算法matlab仿真
本内容介绍了一种基于GA遗传优化的阈值计算方法在认知异构网络(CHN)中的应用。通过Matlab2022a实现算法,完整代码含中文注释与操作视频。能量检测算法用于感知主用户信号,其性能依赖检测阈值。传统固定阈值方法易受噪声影响,而GA算法通过模拟生物进化,在复杂环境中自动优化阈值,提高频谱感知准确性,增强CHN的通信效率与资源利用率。预览效果无水印,核心程序部分展示,适合研究频谱感知与优化算法的学者参考。
|
4月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
152 1
|
4月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
147 0
|
8月前
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
229 3
 算法系列之数据结构-Huffman树
|
1月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
193 0
|
1月前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
143 2
|
2月前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
197 3
|
1月前
|
机器学习/深度学习 算法 机器人
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
137 8
|
1月前
|
机器学习/深度学习 算法 自动驾驶
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
146 8

热门文章

最新文章