演算法導論 5 KMP演算法複雜度證明

2022-02-18 22:49:24 字數 937 閱讀 5648

kmp演算法應該是看了一次又一次,比賽的時候字串不是我負責,所以學到的東西又還給網上的部落格了……

退役後再翻開看,看到模板,心想這不是\(o(n^2)\)的複雜度嗎?

有兩個迴圈也不能看做是\(o(n^2)​\)的,這要用到攤還分析.

這裡用到的模板是算競上的

next[1] = 0;

for (int i = 2, j = 0; i <= n; ++i)

for (int i = 1, j = 0; i <= m; ++i)
可以發現上下兩個函式挺像的,next[i]含義就是模式串以\(i\)結尾的子串([1..i]的字尾)與模式串的字首能匹配的最長長度

觀察發現有兩個操作:

根據記賬法,假設每個平攤代價是2,對於每個匹配成功的操作,其中1元用來j++,另1元就存起來,給後面匹配失敗時用:

而當失配的時候,就會用到銀行存款,最壞的情況當然就是用光了所有存款,但可以發現每個匹配的操作分配兩個時間代價是完全足夠的

換句話說,你使用存款肯定得要求銀行有存款,而每次j++操作都會存1元,在當前j前面必然每個位置都是有大於等於1的存款

所以複雜度就是j++次數的兩倍,也就是匹配串的長度 \(2n\)

根據平攤分析要求\(\check c_i \ge c_i\),平攤代價設定為\(2\)是完全滿足的

綜上所述:kmp演算法兩個函式的總體運算次數為\(2n+2m\),複雜度是\(o(n+m)\)

也不知道這樣分析對不對,如果只是感性理解的話足夠了.

也有勢能法的做法,但是這樣的話就要定義勢能函式,我覺得記賬法還是好理解一點.

演算法導論 時間複雜度分析

非遞迴演算法時間複雜度分析較為簡單,通常是計算演算法中基本語句的執行次數,一般都是乙個關於問題規模n的表示式。例1 如果演算法的執行時間不隨著問題規模n的增加而增長,它的基本語句執行的次數是固定的,總的時間由乙個常數來限界。此類演算法的時間複雜度是o 1 例2 當有若干個迴圈語句時,時間複雜度是由巢...

演算法 演算法複雜度

演算法通俗的來說就是解決一些問題方法和步驟,那麼衡量演算法的標準有如下 1.時間複雜度 時間複雜度也就是通常所說的演算法執行所需要耗費的時間,時間越短,演算法越好,當然也有解釋是程式要執行的次數,而不是程式執行的時間,因為有些機器效能高,程式執行的速度快,二有些機器效能一般執行就慢,所以這裡就不能用...

演算法複雜度

就不加高亮度了。不是特能算這複雜度,但走軟體這條路是務必會算的。定義 如果乙個問題的規模是n,解這一問題的某一演算法所需要的時間為t n 它是n的某一函式 t n 稱為這一演算法的 時間複雜性 當輸入量n逐漸加大時,時間複雜性的極限情形稱為演算法的 漸近時間複雜性 我們常用大o表示法表示時間複雜性,...