《演算法導論》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進製,再由於帝國間商人的文化交流,閔而被採納,沿用至今。觀點二 ...