資料結構筆記 KMP演算法

2021-06-20 01:00:30 字數 698 閱讀 8518

/**

* kmp演算法:每當一趟匹配過程中出現字元比較不等時,不需要回溯i指標,

而是利用已經得到的部分匹配的結果將模式向右滑動盡可能遠的一段距離後,繼續比較

設主串為 s1s2s3...sn,模式串為p1p2p3..pm

需要解決的問題: 當主串中第i和字元與模式串中第j個字元失配時,需要和模式串中哪個字元再比較?

假設需要和模式串中第k個字元比較,則

p1p2p3...pk-1 = si-k+1...si-1

已經得到的部分匹配的結果是

pj-k+1pj-k+2...pj-1 = si-k+1...si-1

由上可知 p1p2p3...pk-1 = pj-k+1pj-k+2...pj-1

若令next[j] = k;則表示當模式中第j個字元與主串失配時,應該與模式中第k個字元繼續比較

以下為kmp演算法:

*/int next[m];

int kmp(char * s, char * p, int pos)

//生成next的原始演算法:

void get_next(char *t, int *next)

}//改進後的演算法

void get_next(char *t, int *next)

else

j = next[j];

}}

資料結構 KMP演算法

求串的模式值next n 定義 1 next 0 1 意義 任何串的第乙個字元的模式值規定為 1。2 next j 1 意義 模式串t中下標為j的字元,如果與首字元相同,且 j的前面的 1 k個字元與開頭的 1 k個字元不等 或者相等但t k t j 1 k 如 t abcabcad 則next 6...

資料結構 KMP演算法

在我的理解,kmp演算法最核心的同時最難理解的是這個next 函式。但是,next 的值是挺好求的,難在哪呢?這個函式難在邏輯。理解起來很費勁,但真的很好用,並且這個函式的結果很好求。例如求模式串t ababaaa 的next j 的函式值 是這樣的,當j 0,next 0 1,對於任何子串,第乙個...

資料結構 KMP演算法

要完善乙個string字串類,那麼實現查詢子串的功能是必不可少的,實現子串查詢可以使用樸素演算法,每次匹配乙個字元後向右移動乙個位置,這樣執行下來效率是比較低的,所以就有了kmp演算法,它能夠準確的知道當前字元不匹配後字串應該向右移動多少位,由於剛接觸kmp演算法,所以很多還明白的不是很透徹,在此記...