考古:写给自己的KMP算法细节分析

注意:此为本人考古半年前的遗迹所得,在此上传。

注意:这是转载。

 

一、复杂度问题

为什么这个程序是O(n)的?其实,主要的争议在于,while循环使得执行次数出现了不 确定因素。我们将用到时间复杂度的摊还分析中的主要策略,简 单地说就是通过观察 某一个变量或函数值的变化来对零散的、杂乱的、不规则的执行次数进行累计。KMP的 时间复杂度分析可谓摊还分析的典型。我们从上述程序 的j 值入手。每一次执行while 循环都会使j减小(但不能减成负的),而另外的改变j值的地方只有第五行。每次执行 了这一行,j都只能加1;因此,整个过程 中j最多加了n个1。于是,j最多只有n次减小 的机会(j值减小的次数当然不能超过n,因为j永远是非负整数)。这告诉我们,while 循环总共最多执行 了n次。按照摊还分析的说法,平摊到每次for循环中后,一次for循 环的复杂度为O(1)。整个过程显然是O(n)的。这样的分析对于后面P数组预处理 的过程 同样有效,同样可以得到预处理过程的复杂度为O(m)。


二、预处理问题

其实就是每次对于自己已有的最长前缀和添加一个字符的后缀的匹配,可以参见该位dalao的cpp内注释 dalao的解释------其实预处理和匹配部分是一样的。

三、匹配全成功,完了以后呢?

这个自己好好想想就行,匹配到len长度这一位,而它本就不存在,相当于再把之前的0~len-1位开始移动,就像正常操作一样。

猜你喜欢

转载自www.cnblogs.com/saigyouji-yuyuko/p/10367452.html