1.為什麼只用研究模式串?因為發生不匹配時,模式串當前下標之前的內容和被查詢串的內容是相同的。
2.為什麼移動方法不是下面的移動法1,而是移動法2?移動法1的思路是:既然原初不匹配情況下,當前位置之前有相同的字首(黃色和紅色),那麼可以直接在開頭跳過對紅色部分的檢索,因為黃色部分已經匹配了,紅黃相同就可以直接跳過。
因為移動法1是在被查詢串中查詢模式串的一部分而已,而不是在被查詢串裡搜尋模式串
3.上述的移動法2,不會跳過可能匹配的部分麼?
之前我們說過,只用研究模式串,在原初不匹配情況下,當前位置之前的內容和被查詢串對應部分是相同的。
那麼就假設紅色部分之前可能有匹配的部分吧,但是乙個字元乙個字元地移動串,會發現如果匹配的話,必須要和黃色部分相同才行,而和黃色部分相同的,也只有紅色部分了。
4.為什麼紅色部分的末尾是挨著當前位置的(出現不匹配情況的下標)?
假設不是挨著的,如下圖,從前往後找,找到乙個和紅色部分匹配的紅色部分。
秉承紅色的已經匹配了,那麼黃色的就不用比較了的思想(黃色和紅色相同),把黃色部分移到紅色部分。
直接接著比較的話,就會有遺漏,而被遺漏的部分不一定和模式串相同
5.為什麼要找最長的公共字首?
因為如果找的不是最長字首,那麼可能跳過匹配的情況,比如下圖直接找 黃色和紅色做為公共字首並且移動的話,就跳過了綠色的b,違背了
上述的 第3點 :移動過程中不能有和模式串開頭相同的部分。
關於KMP演算法的筆記
以前一直沒有搞懂kmp演算法,突然心血來潮,特意去網上搜尋資料下定決心弄懂,終於在一篇文章的幫助下,對kmp演算法有了自己的理解。這篇文章的出處是 the knuth morris pratt algorithm in my own words 一 什麼是kmp演算法?kmp演算法是一種改進的字串匹...
關於KMP演算法的理解
上次因為haipz組織的比賽中有道題必須用到kmp演算法,因此賽後便了解了下它,在仔細拜讀了孤 影神牛的文章之後有種茅塞頓開的感覺,再次orz。附上鏈結 對於整個kmp演算法,最精髓的部分便是關於next陣列的生成。一開始ruijia liu的書上貼上的 感覺完全不能理解,但是看神犇的分析覺得似乎明...
KMP演算法的next陣列求解步驟
主串 s aabbcbbabbcaccd 模式串 t bbabbcac 1 固定前兩個 next 0 1,next 1 0 2 從模式串t 2 開始,這裡是 a 倒序往前面看,如這裡第二個 b 這個 b 為它的長度為1的子串,看到第乙個字母為止。比較這些子串與第乙個字母開始的子串有沒有匹配的,如這裡...