1. 程式人生 > >KMP演算法的思想以及程式碼的實現

KMP演算法的思想以及程式碼的實現

KMP演算法用於快速進行字串匹配,它是基於BF演算法的一種優化,能極大提高匹配的時間複雜度。 它的思想主要是在進行BF演算法的基礎上,當i位置與j位置的字元不匹配時,令i不回退,而j回退到k的位置,如下圖 在這裡插入圖片描述 而KMP的核心,就是尋找這個k的位置,在串中存在兩個 相等的真子串,其中一個串是以0位置開始,另一個以j-1位置結束,這個k的位置就應該在以0位置開始的子串的下一個位置,k的值等於真子串的長度。 這裡引入一個next陣列,來儲存k的值,next陣列的前兩個元素分別為-1,0,因為單個元素不存在子川的匹配,而-1是為了方便後面的判定,如果P陣列中,k位置與i位置的元素相等,那麼next陣列中i+1位置的元素便為k+1;如果不相等,那麼k等於next中k位置的元素。 下面是簡單的程式碼實現:

void Getnext(int *next, char *p, int plen)
{
	next[0] = -1;
	next[1] = 0;
	int k = -1;
	for (int j = 0;j < plen;j++)
	{
		while (p[k + 1] != p[j + 1])
		{
			k = next[k];
		}
		if (p[k + 1] == p[j + 1])
		{
			k = k + 1;
		}
		next[j + 1] = k;
	}
}
int KMP(char *s, int slen, char *p, int plen)
{
	int *next = (int *)malloc(sizeof(plen) + 1);
	memset(next, 0, plen);
	Getnext(next, p, plen);
	int k = -1;
	for (int i = 0;i < slen;i++)
	{
		while (k > -1 && p[k + 1] != s[i])
		{
			k = next[k];
		}
		if (p[k + 1] == s[i])
		{
			k++;
		}
		if (k == plen - 1)
		{
			return i - plen + 1;
		}
	}
}