KMP算法难以理解部分

第一次看KMP算法时,很懵逼,但感觉很牛逼,后面实训时,同学分配到这个算法,看了两天,看了不少文章,终于还是理解到了什么是KMP算法的精髓。


首先讲一些简单的概念。

为什么会出现KMP算法或者是他的优点是什么:

    KMP算法是由三个大佬发现的,优点就是在BF朴素算法上进行优化,将o(m*n)的复杂度,通过对模式串对称性做表,

    变成了o(m+n)。


重点next[]数组的实现

a b a b a a a b 模式串,当我们对其对称性做表时。

通过对最大重复项进行判断。(首先是人工判断)

a(-1)(首位默认为-1,不同的应用初始化不同,此处使用-1)

    b(0)

        a(1)开始出现重复项。

            b(2)

                a(3) 重点 :当前一位相同时,判断当前位是否有最长相同项,当有时aba仍然与前置aba匹配时。

                    会继承与上值next[2]+1

                    a(1)重点:当前值abaa不在与abab匹配时,这时候我们就开始了回溯,

                当我们最后一位a与b不匹配时,我们就会使用到之前所定义好的匹配表。

                此时next[5]的对称性就会小于next[4]的对称性,此时我们将模式串分开

                abaa与abab 我们在ab之间不匹配,此时就回溯我们next[2]上表,继续进行判断

            是否str[next[2]]与str[i]相等,不相等继续回溯,直到next[]返回值<=0时,停止回溯;(关于i值在代码中可见,因为未设置k值,暂时以str[next[2]]代表;当然在此表达的意思是当遇到不匹配时,列如ababaa   当到末尾a时

                        可以理解为abab 与abaa之间的匹配

                       这样k=next[k-1];此列中为k=next[2]是在a之后失配。(因为第一次写博客,前面没写好 这里强调一下)

    回溯next[]值应该就是kmp算法中的精髓,如有错误,欢迎指正。:

代码如下;当前k值可对照。
















猜你喜欢

转载自blog.csdn.net/qq_41111491/article/details/80836972