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


相关文章
|
14天前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
76 29
|
14天前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
72 25
|
14天前
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
58 23
|
1月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
49 2
|
2天前
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
1月前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。
|
1月前
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
147 68
|
1月前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。
|
3天前
|
传感器 算法 物联网
基于粒子群算法的网络最优节点部署优化matlab仿真
本项目基于粒子群优化(PSO)算法,实现WSN网络节点的最优部署,以最大化节点覆盖范围。使用MATLAB2022A进行开发与测试,展示了优化后的节点分布及其覆盖范围。核心代码通过定义目标函数和约束条件,利用PSO算法迭代搜索最佳节点位置,并绘制优化结果图。PSO算法灵感源于鸟群觅食行为,适用于连续和离散空间的优化问题,在通信网络、物联网等领域有广泛应用。该算法通过模拟粒子群体智慧,高效逼近最优解,提升网络性能。
|
3天前
|
机器学习/深度学习 数据采集 算法
基于GWO灰狼优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a,展示了时间序列预测算法的运行效果(无水印)。核心程序包含详细中文注释和操作视频。算法采用CNN-GRU-SAM网络,结合灰狼优化(GWO),通过卷积层提取局部特征、GRU处理长期依赖、自注意力机制捕捉全局特征,最终实现复杂非线性时间序列的高效预测。