kmp演算法是用來實現模式匹配的,其時間複雜度是o(m+n),具體原理見:
其中有用到next陣列來計算子串中公共項的位數,簡單來說,就是子串遇到不匹配時,就查next資料來決定前進幾位(移動位數 = 已匹配的字元數 - 對應的部分匹配值-1)(要不要減一看next陣列第一位是不是為1,個人覺得加一後是有好處的,好處見我的理解的第一條,不好的地方在於不能直接表示首尾匹配的個數,要減一才可以)。
可以這麼任性的前進幾位的依據在於:已經匹配的部分相當於已知的且固定的,因此我們可以用next陣列一次性來計算完成
next[i]值得計算具體如下:
以下這段是複製牛客網上以為大牛的解釋,很到位:
首先看看next陣列值的求解方法例如:
模式串 a b a a b c a c
next值 0 1 1 2 2 3 1 2
next陣列的求解方法是:第一位的next值為0,第二位的next值為1,後面求解每一位的next值時,根據前一位進行比較。首先將前一位與其next值對應的內容進行比較,如果相等,則該位的next值就是前一位的next值加上1;如果不等,向前繼續尋找next值對應的內容來與前一位進行比較,直到找到某個位上內容的next值對應的內容與前一位相等為止,則這個位對應的值加上1即為需求的next值;如果找到第一位都沒有找到與前一位相等的內容,那麼需求的位上的next值即為1。
看起來很令人費解,利用上面的例子具體運算一遍。
1.前兩位必定為0和1。
2.計算第三位的時候,看第二位b的next值,為1,則把b和1對應的a進行比較,不同,則第三位a的next的值為1,因為一直比到最前一位,都沒有發生比較相同的現象。
3.計算第四位的時候,看第三位a的next值,為1,則把a和1對應的a進行比較,相同,則第四位a的next的值為第三位a的next值加上1。為2。因為是在第三位實現了其next值對應的值與第三位的值相同。
4.計算第五位的時候,看第四位a的next值,為2,則把a和2對應的b進行比較,不同,則再將b對應的next值1對應的a與第四位的a進行比較,相同,則第五位的next值為第二位b的next值加上1,為2。因為是在第二位實現了其next值對應的值與第四位的值相同。
5.計算第六位的時候,看第五位b的next值,為2,則把b和2對應的b進行比較,相同,則第六位c的next值為第五位b的next值加上1,為3,因為是在第五位實現了其next值對應的值與第五位相同。
6.計算第七位的時候,看第六位c的next值,為3,則把c和3對應的a進行比較,不同,則再把第3位a的next值1對應的a與第六位c比較,仍然不同,則第七位的next值為1。
7.計算第八位的時候,看第七位a的next值,為1,則把a和1對應的a進行比較,相同,則第八位c的next值為第七位a的next值加上1,為2,因為是在第七位和實現了其next值對應的值與第七位相同。
我的理解:
next[i]的的意義在於:第i個值時會首先與next[i-1]中的值比較,如果相同next[i]的值就在next[i-1]的基礎上加一,如果不同就去比較第乙個值,相同就為2,不同為1.
KMP演算法總結
kmp題目重在理解next陣列的含義 next陣列的作用 next j 記錄模式串中第 j 個字元的最長公共字首長度 重要,這是它的意義所在 第二種理解方式,當模式串與主串失配時,跳回的位置。next len 即字串 0 結束標誌的next值 單個字串匹配時與週期有關 hdu 1711 模板題 33...
KMP演算法總結
現在假設有兩個字串a bbc abcdab abcdabde,b abcdabd。現在要在a中找b。比較暴力的方法是直接搜尋 void gosearch 上述 最核心就是while迴圈,舉兩個例子說明其作用 還是選取b串作為說明。假設現在要求next 6 那麼當前的j next 5 1 next陣列...
kmp演算法總結
kmp演算法總結 kmp演算法,是一種減少字串匹配時複雜度的演算法,本演算法減少了兩個字串遇到不相等的情況是的匹配次數,也就是減少了主串的回溯次數,跳過了不必要的匹配,使原來的m n的時間複雜度變成了m n。kmp演算法大致分為兩個部分 next陣列,next陣列記錄了模式串字首字尾的長度,求模式串...