KMP算法--Next數組原理、代碼實現


https://www.cnblogs.com/tangzhengyue/p/4315393.html  非常詳細

1. next數組的含義:

KMP是在一個母字符串中查找一個子字符串的高效算法。它可以在匹配過程中失配的情況下,有效地多往后面跳幾個字符,加快匹配速度。 

KMP算法中有個數組,叫做前綴數組,也有的叫next數組,每一個子串有一個固定的next數組,它記錄着字符串匹配過程中失配情況下可以向前多跳幾個字符。當然它描述的也是子串的對稱程度,程度越高,值越大,當然之前可能出現再匹配的機會就更大。

 

2.next數組的求解方法

第一位的next值為0,第二位的next值為1,后面求解每一位的next值時,根據前一位進行比較。首先將前一位與其next值對應的內容進行比較,如果相等,則該位的next值就是前一位的next值加上1;如果不等,向前繼續尋找next值對應的內容來與前一位進行比較,直到找到某個位上內容的next值對應的內容與前一位相等為止,則這個位對應的值加上1即為需求的next值;如果找到第一位都沒有找到與前一位相等的內容,那么需求的位上的next值即為1。

3.next數組實現

void SetPrefix(char[] P, int prefix[])

{

     int len=P.length;//模式字符串長度。

     prefix[0]=0;

     for(int i=1; i<len; i++)

     {

         int k=prefix[i-1];

         //不斷遞歸判斷是否存在子對稱,k=0說明不再有子對稱,Pattern[i] != Pattern[k]說明雖然對稱,但是對稱后面的值和當前的字符值不相等,所以繼續遞推

         while( Pattern[i] != Pattern[k]  &&  k!=0 )               

             k=prefix[k-1];     //繼續遞歸

         if( Pattern[i] == Pattern[k])//找到了這個子對稱,或者是直接繼承了前面的對稱性,這兩種都在前面的基礎上++

              prefix[i]=k+1;

         else

              prefix[i]=0;       //如果遍歷了所有子對稱都無效,說明這個新字符不具有對稱性,清0

     }

}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM