專注分享linux後台伺服器開發,包括c/c++,linux,nginx,zeromq,mysql,redis,fastdfs,mongodb,zk,流**,cdn,p2p,k8s,docker,tcp/ip,協程,dpdk等等
kmp演算法是用來求乙個較長字串是否包含另乙個較短字串的演算法。
int *next = new int[length];
//這裡的str是被包含的較短字串,length是這個字串的長度。
void next(char *str, int *next, int length)
if (str[k + 1] == str[q])//如果相同,k++
next[q] = k;}}
理解這裡是用被包含的較短字串,自己與自己匹配,求得next陣列,然後再進行演算法的後續步驟。
next陣列中儲存的是這個字串字首和字尾中相同字串的最長長度。比如abcdefgabc,字首和字尾相同的是abc,長度是3。
next[i]儲存的是string中前i+1位字串字首和字尾的最長長度。如abadefg,next[2]存的是aba這個字串字首和字尾的最長長度。
但是這裡為了和**相對應,將-1定義為相同長度為0,0定義為相同長度為1,……依次類推
這裡用乙個比較明顯的字串abababac來做例子,先建立乙個和字串長度相同的陣列next。第一位設為-1。
所以向後移一位開始比較
a和b不同,next第二位寫-1
再向後移一位
a和a相同,next陣列存前乙個k=-1加1等於0.
再比較下一位,相同就比前乙個加一。
到第7位時,c和b不再相等,這時就用到了回溯!!!先看下一次比較時,應該移動到**。
原因要再回來看上一次比較,上一次比較相同長度為5。
看這5個字串相同的前字尾的長度,即next[4]中儲存的值:2再加1,因為這5個字串就是str的前五個字串!
所以k先回溯到2,再比較下乙個字元是否相同,這裡是比較c和b,不同,再回溯,這次前面剩下aba三個字元,k=next[2]=0,即前字尾還有乙個字元相同,所以應該後移到下圖位置。
再比較c和b,還不同,再回溯,k=next[0]=-1,然後next[7]=-1,這樣就求出了next陣列了。
關注我,每天分享linux後台伺服器開發,包括c/c++,linux,nginx,zeromq,mysql,redis,fastdfs,mongodb,zk,流**,cdn,p2p,k8s,docker,tcp/ip,協程,dpdk等。
KMP演算法 next陣列
通過上文完全可以對kmp演算法的原理有個清晰的了解,那麼下一步就是程式設計實現了,其中最重要的就是如何根據待匹配的模版字串求出對應每一位的最大相同前字尾的長度。我先給出我的 1 void makenext const char p,int next 214 next q k 15 16 現在我著重講...
KMP演算法 NEXT陣列
kmp和next陣列基本上是一起用的,有了next陣列,才有kmp演算法,講道理來說這兩個都是基於最大前字尾和,也就是說需要用到kmp的時候必須先把next陣列先求出來,next陣列就是由所匹配的word的每個子串的前字尾和最大匹配得到的,說實話next陣列的演算法給優化得已經很無解了,以至於至今我...
KMP演算法之Next陣列 C
這篇文章不解釋什麼是o n 記法 kmp是乙個兩串字串比較的演算法,分別為p 模式串,s 文字串。我的文章一般都是廢話少說,直接就進入主題。我們假設現在需要匹配如下 傳統的做法 逐一的遍歷s串,再遍歷p串,s i p j i 0,j 0 因為不相等,所以 i 會自增 1 j 回溯 0,當 i 7 發...