最近在研究算法,不得不說,算法是一個巧奪天工的東西;前幾天就研究了一個關於字符串匹配的算法——KMP算法。
俗話所說的好,掌握一個東西就要從其最本質的最核心的原理入手;工作上廣爲傳頌的二八原理——掌握了20%的精華,餘下80%就是細枝末節,就很容易搞定了。
MP算法是基於BF算法改進,減少了字符串的重複遍歷次數,其原理最主要是依靠一個非常著名的NEXT數組,理解了該數組就理解了KMP算法的核心。
NEXT數組作用:
當模式匹配字符串T與目標字符串S失配時,NEXT數組對應的元素指導應該用T字符串的哪一個元素進行下一輪的匹配。
NEXT數組元素內容的填寫(關鍵步驟)(自己通俗易懂的理解,希望可以幫到大家):
重點是看要填的元素前綴和後綴的匹配數目,這麼講大家可能會雲裏霧裏摸不着頭腦,還是直接見圖來的直快:
下面是一個實例(大家可以親自走一遍,就會了然於胸):
T | 9 | m | n | m | n | m | m | m | n | m |
---|---|---|---|---|---|---|---|---|---|---|
下標 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
next | x | 0 | 1 | 1 | 2 | 3 | 4 | 2 | 2 | 3 |
i(後綴)=1 2 * 3 4 5 6 7 * 8 9
j(前綴)=0 1 0 1 2 3 4 2 1 2 3
獲取next數組元素的代碼如下:
void GetNext(String T,int* next)
{
int i=1,j=0;
next[i]=0;
while(i<T[0])
{
if(j==0||T[i]==T[j])
{
i++;
j++;
next[i]=j;
}
else
{
j=next[j];
}
}
}
//String是模式匹配串,int*next是指向next數組的指針;
//大家根據代碼自己走一遍,再對照之前的填充技巧,將會很好地理解next數組。
實踐出真知,只有不停的實踐,編程內功纔會不斷的提升;同時也要勤于思考,別人能想到的自己也一定可以想到,很多算法就是一步一步慢慢從簡單堆積而來。只要比別人想的深一點點,也許將會有意想不到的收穫!