KMP演算法的思想以及程式碼的實現
阿新 • • 發佈:2018-12-12
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; } } }