kmp演算法是一種模式串匹配演算法,即在主串s中找到模式串t第一次出現的首個字元在主串中的位置的一種相對高效的演算法。
為什麼說kmp相對高效,這是因為在蠻力(bf)演算法中如果當i!=j時,不僅僅j(模式串指標) 需要回退到第乙個字元的位置,並且主串指標(此處的指標說的是i)也需要回退到第 (i-j+1)+1個字元的位置上再進行下一次匹配運算。而kmp演算法中的模式串j雖然仍然需要回退,但是i在運算中不會再回退只會往前走。而j是怎麼回退,回退到哪乙個模式串中的哪個字元位置上呢?這就引出了next值的概念,next是一組通過特殊運算後得到的乙個陣列,在下面的分析中將會看到求解方法。而剛剛所說的j就是退回到了這個對應的第next個字元位置。
貼上kmp演算法的主**,邏輯思路就是剛剛所說的
int kmp(string s,string t)
if(j==t.length())return i-t.length(); //匹配成功}}
資料結構 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演算法,所以很多還明白的不是很透徹,在此記...