数据结构学习笔记——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。


相关文章
|
6天前
|
存储 监控 NoSQL
Redis处理大量数据主要依赖于其内存存储结构、高效的数据结构和算法,以及一系列的优化策略
【5月更文挑战第15天】Redis处理大量数据依赖内存存储、高效数据结构和优化策略。选择合适的数据结构、利用批量操作减少网络开销、控制批量大小、使用Redis Cluster进行分布式存储、优化内存使用及监控调优是关键。通过这些方法,Redis能有效处理大量数据并保持高性能。
26 0
|
4天前
|
缓存 算法 Java
数据结构~缓存淘汰算法--LRU算法(Java的俩种实现方式,万字解析
数据结构~缓存淘汰算法--LRU算法(Java的俩种实现方式,万字解析
|
6天前
|
机器学习/深度学习 算法 数据可视化
Python 数据结构和算法实用指南(四)(4)
Python 数据结构和算法实用指南(四)
13 1
|
6天前
|
机器学习/深度学习 存储 算法
Python 数据结构和算法实用指南(四)(3)
Python 数据结构和算法实用指南(四)
15 1
|
6天前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
3天前
|
算法
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长
MATLAB 2022a仿真实现了LDPC码的性能分析,展示了不同码长对纠错能力的影响。短码长LDPC码收敛快但纠错能力有限,长码长则提供更强纠错能力但易陷入局部最优。核心代码通过循环进行误码率仿真,根据EsN0计算误比特率,并保存不同码长(12-768)的结果数据。
21 9
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长
|
4天前
|
算法
MATLAB|【免费】融合正余弦和柯西变异的麻雀优化算法SCSSA-CNN-BiLSTM双向长短期记忆网络预测模型
这段内容介绍了一个使用改进的麻雀搜索算法优化CNN-BiLSTM模型进行多输入单输出预测的程序。程序通过融合正余弦和柯西变异提升算法性能,主要优化学习率、正则化参数及BiLSTM的隐层神经元数量。它利用一段简单的风速数据进行演示,对比了改进算法与粒子群、灰狼算法的优化效果。代码包括数据导入、预处理和模型构建部分,并展示了优化前后的效果。建议使用高版本MATLAB运行。
|
6天前
|
算法 计算机视觉
基于高斯混合模型的视频背景提取和人员跟踪算法matlab仿真
该内容是关于使用MATLAB2013B实现基于高斯混合模型(GMM)的视频背景提取和人员跟踪算法。算法通过GMM建立背景模型,新帧与模型比较,提取前景并进行人员跟踪。文章附有程序代码示例,展示从读取视频到结果显示的流程。最后,结果保存在Result.mat文件中。
|
6天前
|
资源调度 算法 块存储
m基于遗传优化的LDPC码OMS译码算法最优偏移参数计算和误码率matlab仿真
MATLAB2022a仿真实现了遗传优化的LDPC码OSD译码算法,通过自动搜索最佳偏移参数ΔΔ以提升纠错性能。该算法结合了低密度奇偶校验码和有序统计译码理论,利用遗传算法进行全局优化,避免手动调整,提高译码效率。核心程序包括编码、调制、AWGN信道模拟及软输入软输出译码等步骤,通过仿真曲线展示了不同SNR下的误码率性能。
10 1
|
6天前
|
存储 算法 数据可视化
基于harris角点和RANSAC算法的图像拼接matlab仿真
本文介绍了使用MATLAB2022a进行图像拼接的流程,涉及Harris角点检测和RANSAC算法。Harris角点检测寻找图像中局部曲率变化显著的点,RANSAC则用于排除噪声和异常点,找到最佳匹配。核心程序包括自定义的Harris角点计算函数,RANSAC参数设置,以及匹配点的可视化和仿射变换矩阵计算,最终生成全景图像。