1. 程式人生 > >資料結構KMP演算法中課本上的next陣列和nextval陣列求解方法

資料結構KMP演算法中課本上的next陣列和nextval陣列求解方法

next陣列的求解方法是:第一位的next值為0,第二位的next值為1,後面求解每一位的next值時,根據前一位進行比較。首先將前一位與其next值對應的內容進行比較,如果相等,則該位的next值就是前一位的next值加上1;如果不等,向前繼續尋找next值對應的內容來與前一位進行比較,直到找到某個位上內容的)(next值對應的內容)與前一位相等為止,則(這個位對應的值)加上1即為需求的next值;如果找到第一位都沒有找到與前一位相等的內容,那麼需求的位上的next值即為1。     注意上面紅括號是指跳板加1

例如: 模式串 a b a a b c a c            

              next值 0 1 1 2 2 3 1 2

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

nextval值的求法:

第一位必為0,第二位相同為0,不同為1,其餘位讓其自身與其next值進行比較,不同則該位nextval值即為其next值,如果相同,則不停往前遞進,直到不同為止,(遞進的話最終得到的nextval值為跳板的next值)如果比到第一位還是相同,則該位nextvai值就填0。

例如:模式串       a b a a b c a c

           next值        0 1 1 2 2 3 1 2

                              0 1 0 2 1 3 0 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。