相信通过今天的文章,你会对KMP的认识更加深入一层,不止停留在知道如何计算的层面上了,废话不多说,开始。
通过前面的第一篇文章,知道了怎么求next数组,相信很多喜欢刨根问底的人就会问,我按照你的做法确实能够解决这个问题,那么next数组到底是个神马东西喃?为啥会那样求喃?
next数组为啥那样求?今天翻阅算法导论发现有证明next数组迭代计算的正确性,能够理解点,但是还不到能够写出来的程度,又把july的文章大致浏览下,想看看他是怎么介绍的,发现他把这部分也略过了,在文章最后说用了1年的时间才完全明白理解。看看现在的我,也还是处于尚未完全理解的程度,所以这部分(next数组的计算原因)决定暂且放下不写,释怀一段时间(估计会很长,因为接下来时间会很紧)后有精力再学习的时候加上。
所以今天就说说,next数组到底是个神马东西? 本篇文章以 阮一峰 那篇文章的最后一部分开始,如果你不了解KMP或没看过我的第一篇KMP的文章,那最好先花5到10分钟先阅读也算是预热一下。一、以"ABCDABD"为例,来了解下前缀,后缀:- "A"的前缀和后缀都为空集,共有元素的长度为0; - "AB"的前缀为[A],后缀为[B],共有元素的长度为0; - "ABC"的前缀为[A, AB],后缀为[BC, C],共有元素的长度0; - "ABCD"的前缀为[A, AB, ABC],后缀为[BCD, CD, D],共有元素的长度为0; - "ABCDA"的前缀为[A, AB, ABC, ABCD],后缀为[BCDA, CDA, DA, A],共有元素为"A",长度为1; - "ABCDAB"的前缀为[A, AB, ABC, ABCD, ABCDA],后缀为[BCDAB, CDAB, DAB, AB, B],共有元素为"AB",长度为2; - "ABCDABD"的前缀为[A, AB, ABC, ABCD, ABCDA, ABCDAB],后缀为[BCDABD, CDABD, DABD, ABD, BD, D],共有元素的长度为0。
二、next数组存储的是 模式串中 之前已经匹配的字符 的"前缀"和"后缀"的 最长的 共有元素 的长度。 概念比较绕,注意我上面句子中使用了空格来帮助你理解,下面举个例子说下, 有模式串 T = "ABCDABD"

三、next数组的另一理解(对于学习后面的BM算法做一点点小小的铺垫) 假设有一如下的匹配
如果你觉得本篇对你有收获,请帮顶。
另外,我本人开通了微信公众号--分享技术之美,我会不定期的分享一些我学习的东西.你可以搜索公众号:swalge 或者扫描下方二维码关注我
(转载文章请注明出处: http://blog.csdn.net/swagle/article/details/24112823 )