大名鼎鼎的KMP算法之NEXT數組原理及獲取講解

最近在研究算法,不得不說,算法是一個巧奪天工的東西;前幾天就研究了一個關於字符串匹配的算法——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數組。

實踐出真知,只有不停的實踐,編程內功纔會不斷的提升;同時也要勤于思考,別人能想到的自己也一定可以想到,很多算法就是一步一步慢慢從簡單堆積而來。只要比別人想的深一點點,也許將會有意想不到的收穫!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章