KMP演算法中怎麼求next陣列

2021-07-16 02:10:01 字數 1088 閱讀 8481

例如:            1  2  3  4  5  6  7  8 

模式串   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值對應的值與第七位相同

幫你理解KMP演算法以及怎麼求next陣列

kmp演算法做的事情就是用來進行字串匹配,並且盡量高效地去移動模式串,避免不必要的匹配。在字串a中找尋是否存在部分等於字串b,在這裡我們把b看做模式串,去跟字串a做匹配 這個匹配的規則是這樣的,對於模式串b的某一位出現了失配的情況,那麼如果前面存在最長k位的部分匹配,就將模式串向後移到讓模式串的k ...

學習筆記 KMP演算法的Next陣列怎麼求

首先定義乙個概念 字串 不定義了。字首pre i s 1.i 字尾記為suf i s i.1 子串 略。border 如果在字串s中,存在乙個字首等於它的字尾,就稱這個字首是這個字串的乙個border。ps 不允許選擇整個串 顯然乙個字串可能有若干個border。記乙個字串中的最長的border為l...

KMP模式匹配演算法求next陣列

j12 3456 78值a baab cacnext01 1223 12j是字串中的位置 從1開始計算 值是字串對應j位置的字母,next是next陣列中的值。下面是計算方法 1 首先next 1 0,next 2 1 這兩個是固定不變的 2 除了j 1和j 2時,求解next j 首先我們要獲取到...