KMP演算法中nextval陣列的計算方法

2022-02-11 17:24:10 字數 1963 閱讀 5457

kmp演算法即knuth-morris-pratt演算法,是模式匹配的一種改進演算法,因為是名字中三人同時發現的,所以稱為kmp演算法。因為偶然接觸到有關kmp的問題,所以上網查了一下next陣列和nextval陣列的求法,卻沒有找到,只有在csdn的資料檔案裡找到了next陣列的簡單求法(根據書上提供的程式也可以求到,但一般在課堂講解的時候,學生難以理解,所以希望以更容易理解的形式來講解),那位高人說時間關係,先講到這裡,於是講完了next陣列就功成身退了。bs的同時,自己研究了下nextwal陣列,發現了其中的簡易規律,並寫了出來,希望能對需要快速理解kmp中nextval的求法的朋友有所幫助。     int get_nextval(sstring t,int &nextval[ ]){         //求模式串t的next函式修正值並存入陣列nextval。         i=1; nextval[1]=0; j=0;         while(i1  2  3  4  5  6  a  a  a  a  *  *  a  a  a  a  b      a  a  a  a  b

前面的三個a都不需要進行比較,只要確定主串中不等於b的那個位是否為a,即可以進行如下的比較:如果為a,則繼續比較主串後面一位是否為b;如果不為a,則此次比較結束,繼續將模式串的第一位去與主串的下一位進行比較。由此看來,在模式串的第五位上,進行的比較偏移了4位(不進行偏移,直接比較下一位為0),故第五位b的nextval值為4。     我們可以利用第乙個例子「abaabcac」對這種方法進行驗證。     a的nextval值為0,因為如果主串的第一位不是a,那麼沒有再比較下去的必要,直接比較主串的第二位是否為a。如果比較到主串的第二位才發生錯誤,則主串第一位肯定為a,第二位肯定不為b,此時不能直接跳到第三位進行比較,因為第二位還可能是a,所以對主串的第二位再進行一次比較,偏移了1位,故模式串第二位的nextval值為1。以此類推,nextval值分別為:01021302。其中第六位的nextval之所以為3,是因為,如果主串比較到第六位才發生不匹配現象,那麼主串的前五位必定為「abaab」且第六位必定不是「c」,但第六位如果為「a」的話,那麼我們就可以從模式串的第四位繼續比較下去。所以,這次比較為:

1  2  3 4   5  6  7  8  9 10  11   12  a  b  a  a  b  *  *  *  *  *  *  *        a  b  a  a  b  c  a  c  

而不是:  1  2  3 4   5  6  7  8  9 10  11   12  a  b  a  a  b  *  *  *  *  *  *  *            a  b  a  a  b  c  a

因為前兩位a和b已經確定了,所以不需要再進行比較了。所以模式串第六位的nextval值為這次比較的偏移量3。     再來看求nextval陣列值的第二種方法。  模式串  a  b  a  a  b  c  a  c  next值  0  1  1  2  2  3  1  2  nextval值  0  1  0  2  1  3  0  2

1.第一位的nextval值必定為0,第二位如果於第一位相同則為0,如果不同則為1。     2.第三位的next值為1,那麼將第三位和第一位進行比較,均為a,相同,則,第三位的nextval值為0。     3.第四位的next值為2,那麼將第四位和第二位進行比較,不同,則第四位的nextval值為其next值,為2。     4.第五位的next值為2,那麼將第五位和第二位進行比較,相同,第二位的next值為1,則繼續將第二位與第一位進行比較,不同,則第五位的nextval值為第二位的next值,為1。     5.第六位的next值為3,那麼將第六位和第三位進行比較,不同,則第六位的nextval值為其next值,為3。     6.第七位的next值為1,那麼將第七位和第一位進行比較,相同,則第七位的nextval值為0。     7.第八位的next值為2,那麼將第八位和第二位進行比較,不同,則第八位的nextval值為其next值,為2。     在「aaaab」內進行驗證。  模式串  a  a  a  a  b  next值  0  1  2  3  4  nextval值  0  0  0  0  4

KMP演算法中改進的nextval陣列

我們在上篇文章中講到的next陣列其實再某些情況下是有缺陷的,例如在模式串s aaaab 和主串t aaabaaaab 匹配時,當在i 4,j 4時,產生失配,由下圖的next陣列中指出還需進行 i 4,j 3 i 4,j 2 i 4,j 1這三次比較。但是我們發現這樣的比較是沒有意義的,因為s串中...

kmp演算法中的nextval

求nextval陣列值有兩種方法,一種是不依賴next陣列值直接用觀察法求得,一種方法是根據next陣列值進行推理,兩種方法均可使用,視更喜歡哪種方法而定。本文主要分析nextval陣列值的第二種方法即 記p next i 將 s i 與 s p 進行比較 1 二者相同,則,nextval i ne...

KMP模式匹配演算法改進 nextval陣列

建議先複習乙個kmp演算法 這裡可以發現,2345步驟,其實都是多餘的判斷,由於t串中的2345位置的字元都與首位的a相等,那麼可以利用首位next 1 的值去取代與它相等1的字元後續的next j 的值,因此我們要對next函式進行改良 我們把改良後的next陣列叫做nextval include...