KMP算法个人解析

本文参考《大话数据结构》与青岛大学王卓老师的数据结构讲解视频结合自己的理解给出,如有不妥,欢迎大家交流。
王卓老师视频:https://www.bilibili.com/read/cv2306631?spm_id_from=333.788.b_636f6d6d656e74.227
KMP算法个人解析_第1张图片KMP算法个人解析_第2张图片
KMP算法个人解析_第3张图片
KMP算法个人解析_第4张图片
KMP算法个人解析_第5张图片
KMP算法个人解析_第6张图片
KMP算法个人解析_第7张图片
KMP算法个人解析_第8张图片
KMP算法个人解析_第9张图片
这里说回溯可以不用发生,可以这样理解,即如果T字符串的前缀和后缀一致,则,直接回溯到j位置,即相当于对i进行了回溯。我们在后面可以发现,next[j]值均为前缀与后缀可相等的最大值,这样就保证了对于i来说可以,我可以在i不回溯的情况下得到i回溯时最先发生的情况。同样,如果next[j]位置也有next[next[j]] 位置,依次把i往前移动,即可得到所有可能情况。
KMP算法个人解析_第10张图片
KMP算法个人解析_第11张图片
KMP算法个人解析_第12张图片
在这里插入图片描述
KMP算法个人解析_第13张图片
KMP算法个人解析_第14张图片
在这里插入图片描述
next数组的计算可以理解为找T字符串前缀和后缀匹配的个数的过程。这样可以保证,每次回溯的均是i最先可能出现相等的情况。
KMP算法个人解析_第15张图片
这里主要注意,每次回溯到的位置是next[j],这里的j即可以理解为T字符串中的j,即它前面的字符串为目前1.。。。i这个字符串的前缀。

KMP算法个人解析_第16张图片
KMP算法个人解析_第17张图片
KMP算法个人解析_第18张图片
KMP算法个人解析_第19张图片
KMP算法个人解析_第20张图片
KMP算法个人解析_第21张图片
KMP算法个人解析_第22张图片
这里其实可以理解为,如果j位置和nextval[j]的值一致,如果S[i]与T[j]不匹配,则s[i]与T[nextval[j]]也不会匹配,所以其实是对next[i]值的修正。
KMP算法个人解析_第23张图片
KMP算法个人解析_第24张图片
KMP算法个人解析_第25张图片
KMP算法个人解析_第26张图片
在这里插入图片描述

你可能感兴趣的:(算法)