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