為什麼KMP演算法的預處理時間是 m ?

2021-07-15 11:59:03 字數 1012 閱讀 8197

《演算法導論》p590已經描述過,但並沒有細說,或者只是描述乙個名詞「攤還分析」,所以我按自己的理解重新描述

compute-prefix-function(p)

m=p.length

let π[1..m] be a new array

π[1]=0

k=0for 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所以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

----------------------------------------------無恥的分割線-----------------------------------------------

所以,kmp演算法的預處理時間是θ(m)

qes

快速選擇演算法的時間複雜度為什麼是O n ?

一 引言 今天學了乙個快速選擇演算法,這個演算法跟快排差不多,只不過專門用來在選擇陣列中第k大 小的數時,可以免去將整個陣列排序後選擇第k個數。將整個陣列排序再選擇第k個數的時間複雜度是o nlog n 快速選擇演算法將平均時間複雜度優化到o n 但最壞的情況還是o n 2 一開始很糾結這個o n ...

為什麼TIME WAIT的時間是2MSL

msl指的是任何ip資料報能夠在網際網路上存活的最長時間。time wait的狀態是為了等待連線上所有的分組的消失。單純的想法,傳送端只需要等待乙個msl就足夠了。這是不夠的,假設現在乙個msl的時候,接收端需要傳送乙個應答,這時候,我們也必須等待這個應答的消失,這個應答的消失也是需要乙個msl,所...

為什麼時間是60進製的啊? ? ?

時間 60進製在不少領域內都有應用。比如時間 角度,還有我國的天乾 地支記年法等等。那麼,為什麼時間要用60進製呢?觀點一 古羅馬帝國的傳統 我國自古以來最吉利的數字是5和9,而古羅馬帝國是6和0。所以在很久以前,古羅馬帝國時間就是60進製,再由於帝國間商人的文化交流,閔而被採納,沿用至今。觀點二 ...