为什么KMP算法的预处理时间是Θ(m)?

来源:互联网 发布:finale for mac 编辑:程序博客网 时间:2024/05/29 15:48

《算法导论》P590已经描述过,但并没有细说,或者只是描述一个名词“摊还分析”,所以我按自己的理解重新描述


COMPUTE-PREFIX-FUNCTION(P)

m=P.lengthlet π[1..m] be a new arrayπ[1]=0k=0for q=2 to mwhile k>0 and P[k+1]!=P[q]k=π[k]if P[k+1]==P[q]k=k+1π[q]=kreturn π

(1)初始化时,k=0,q=2,每次for循环后q都会增加1。但是,k只有在if中才会增加,在while中只会减少,所以k<q始终都成立,所以k的增加次数不超过m你可以想象一下:


q不会减少,而且每次都增加1;

k有可能会减少,每次增加1,也有可能不增加,因为if不一定成立


(2)上面也说了,k的增加次数不会超过m,而且k>0必须成立。


所以,当k==0时,while只会在每次for循环执行一次;

当k>0时,就会不断地减小。


但是,由于(1)中说了,k的增加次数不会超过m,所以,k的减少次数也不会超过m


----------------------------------------------无耻的分割线-----------------------------------------------

所以,相当于在每次for循环中,while循环一般都执行1次。

while总的执行次数 < for循环执行次数+k


for循环次数大概是m,而k<m,所以while的总的执行次数<2m。


----------------------------------------------无耻的分割线-----------------------------------------------

所以,KMP算法的预处理时间是Θ(m)


QES

1 0
原创粉丝点击