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表示法表示時間複雜性,...