KMP演算法的正確性證明及乙個小優化

2021-07-23 10:01:41 字數 1804 閱讀 7276

直接把作業帖上來是不是有點不太公道呀。。。

無所謂啦反正各位看著開心就行kmp演算法對於模式串pp,建立其字首函式nn ,其中n[q]n[q] 表示在pp中,以qq位置為結束的可以匹配到字首的最長字尾的長度(也可以理解為那個字首的結束位置),在匹配中,若p[i]p[i]與s[j]s[j]失配,則令i=n[i?1]+1i=n[i?1]+1 ,否則現考慮如何構造nn ,設當前以計算出n[1..i?1]n[1..i?1] ,則令k=n[i?1]k=n[i?1] ,若 p[k+1]=p[i]p[k+1]=p[i],則令n[i]=k+1n[i]=k+1 ,否則令k=n[k]k=n[k] 。重複上述過程,直至找到可證該演算法能在θ(|p|)θ(|p|) 的時間內構造出字首函式nn ,在θ(|s|)θ(|s|) 的時間內完成匹配,總的時間複雜度為kmp演算法的正確性證明先證明匹配過程的正確性:在過程中,若p[1..q]p[1..q] 與s[s+1...s+q]s[s+1...s+q] 匹配,而p[q+1]p[q+1]與s[s+q+1]s[s+q+1] 失配,那麼由nn的定義可立即得出p[1..n[q]]p[1..n[q]] 與 s[s+q?n[q]+1...s+q]s[s+q?n[q]+1...s+q] 匹配,而s[1...t]s[1...t]與s[s+q?t+1...s+q]s[s+q?t+1...s+q] 失配(n[q]接下來證明字首函式nn計算的正確性:令n?[q]=n?[q]= 其中n(t)[q]=n(t?1)[q],n(0)[q]=n[q]n(t)[q]=n(t?1)[q],n(0)[q]=n[q] ,那麼n?[q]n?[q] 為以q位置為結束的可以匹配到字首的字尾的所有長度(即匹配到所有字首的位置),同時有n[q]?1∈n?[q?1]n[q]?1∈n?[q?1] ,因此只需從大到小列舉n?[q?1]n?[q?1] 中的元素並通過判斷即可得出n[q]n[q] 。

kmp演算法的時間複雜度證明在匹配時:i,ji,j增長了|s||s| ,而在i=n[i?1]+1i=n[i?1]+1 中,ii 至少減少1,即該語句至多執行了|s||s|次,因此時間複雜度為θ(|s|)θ(|s|)。

構造字首函式nn 時: 我們考慮k的變化,我們可以得到,在每次k=n[k]k=n[k] 中,kk 至少減少1,又因為kk隨ii增加了|p||p|次,即該語句至多執行|p||p| 次,因此時間複雜度為θ(|p|)θ(|p|) 。

因此總的時間複雜度為θ(|s|+www.csy5294.cn|p|)θ(|s|+|p|) 。

kmp演算法的優化我們希望通過優化,為了減少失配的概率,因此提出如下改進:在構造n′n′陣列時,當p[k+1]=p[i]p[k+1]=p[i] 時,若p[i+1]=p[k+2]p[i+1]=p[k+2] 則n′[i]=k+1n′[i]=k+1 否則n′[i]=n′[k+1]n′[i]=n′[k+1] 。

該優化的正確性證明在匹配時,我們發現,若p[q+1]p[q+1] 與s[s+q+1]s[s+q+1]失配,同時p[q+1]=p[n(t)[q]+1]p[q+1]=p[n(t)[q]+1] ,則p[n(t)[q]+1]p[n(t)[q]+1]一定與s[s+q+1]swww.ludipt77.cn [s+q+1] 失配,因此若p[n[q]+1]=p[q+1]p[n[q]+1]=p[q+1] ,則該比較一定失配,無需考慮。

在該優化中,由該函式的遞迴求法可得,n′[q]=maxn′[q]=max ,因此n′[q]n′[q] 依舊能列舉完所有可能匹配的字首,同時減少失配概率。

該優化對演算法空間與時間複雜度的影響由於該優化只是改變了n陣列的構造方法,因此對空間複雜度無影響。

時間複雜度的證明同kmp的證明,可得對最壞情況下的時間複雜度無影響由於該演算法避免了出現p[n[q]+1]=p[q+1]p[n[q]+1]=p[q+1]的情況,因此對於有較多重複子串的模式串有較好的優化效果(如www.yinb666.cnaaaab,abcabcabcd)

kmp優化正確性證明

鄧俊輝老師的課上給出了一種普遍的kmp演算法優化,但是沒有給出這種優化的正確性證明。或許這種正確性是顯而易見的,但這裡還是研究了一下這個演算法的正確性問題。int buildnext char p else 原演算法 j next j 優化演算法 j newnext j return next 顯然...

Dijkstra演算法正確性證明

問題 求圖中點1到其他各點的最短距離 演算法描述 設初始時圖的所有點的集合u 把起點s放入初始集合set中 u u set set 找s經過集合set中的點,能達到的距離最短的點k k in u 將k併入set 言外之意k的前乙個點必然屬於set u u set set 由於每次引入的只有乙個點k,...

Dijkstra演算法正確性證明

問題 求圖中點1到其他各點的最短距離 策略 1.把起點1放入初始集合set中,從剩餘的點中,選取到set 此時set中只有1個點 距離最近的點,併入集合set中,2.從剩餘的點中,找經過集合set,到起點1的最短距離,將最短邊併入set集合 3.依次迴圈,直到所有的邊都併入set 變數的命名 set...