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

《算法导论》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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值