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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_19648191/article/details/52007624

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


COMPUTE-PREFIX-FUNCTION(P)

m=P.length
let π[1..m] be a new array
π[1]=0
k=0
for q=2 to m
	while k>0 and P[k+1]!=P[q]
		k=π[k]
	if P[k+1]==P[q]
		k=k+1
	π[q]=k
return π

(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

阅读更多
换一批

没有更多推荐了,返回首页