数据结构学习笔记——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月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
117 4
|
11天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
49 20
|
2月前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
2月前
|
算法
数据结构之路由表查找算法(深度优先搜索和宽度优先搜索)
在网络通信中,路由表用于指导数据包的传输路径。本文介绍了两种常用的路由表查找算法——深度优先算法(DFS)和宽度优先算法(BFS)。DFS使用栈实现,适合路径问题;BFS使用队列,保证找到最短路径。两者均能有效查找路由信息,但适用场景不同,需根据具体需求选择。文中还提供了这两种算法的核心代码及测试结果,验证了算法的有效性。
112 23
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
65 1
|
10天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
143 80
|
3天前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。
|
6天前
|
机器学习/深度学习 数据采集 算法
基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-GRU-SAM网络在时间序列预测中的应用。算法通过卷积层、GRU层、自注意力机制层提取特征,结合粒子群优化提升预测准确性。完整程序运行效果无水印,提供Matlab2022a版本代码,含详细中文注释和操作视频。适用于金融市场、气象预报等领域,有效处理非线性数据,提高预测稳定性和效率。
|
2天前
|
算法
基于梯度流的扩散映射卡尔曼滤波算法的信号预处理matlab仿真
本项目基于梯度流的扩散映射卡尔曼滤波算法(GFDMKF),用于信号预处理的MATLAB仿真。通过设置不同噪声大小,测试滤波效果。核心代码实现数据加载、含噪信号生成、扩散映射构建及DMK滤波器应用,并展示含噪与无噪信号及滤波结果的对比图。GFDMKF结合非线性流形学习与经典卡尔曼滤波,提高对非线性高维信号的滤波和跟踪性能。 **主要步骤:** 1. 加载数据并生成含噪测量值。 2. 使用扩散映射捕捉低维流形结构。 3. 应用DMK滤波器进行状态估计。 4. 绘制不同SNR下的轨迹示例。
|
7天前
|
机器学习/深度学习 算法 索引
单目标问题的烟花优化算法求解matlab仿真,对比PSO和GA
本项目使用FW烟花优化算法求解单目标问题,并在MATLAB2022A中实现仿真,对比PSO和GA的性能。核心代码展示了适应度计算、火花生成及位置约束等关键步骤。最终通过收敛曲线对比三种算法的优化效果。烟花优化算法模拟烟花爆炸过程,探索搜索空间,寻找全局最优解,适用于复杂非线性问题。PSO和GA则分别适合快速收敛和大解空间的问题。参数调整和算法特性分析显示了各自的优势与局限。