資料結構 通俗語言描述KMP演算法核心

2021-09-24 05:37:17 字數 883 閱讀 3919

樸素的求母串s裡有多少個子串t,就是母串裡從1開始到末尾,擷取和子串相同長度的一段字串,和子串t比,一樣就返回1不一樣就繼續取下一串。

要是子串裡的字元都是不一樣的就是這麼比的,但是子串裡要是有一些是重複的,這樣比就多比了很多步。

next陣列就是,把子串裡各個字元位置的下標值定義為乙個陣列,告訴你這個位置識別出不同了,該跳到子串的**繼續對比,可以少比一些;

求next陣列的**如下:

void

get_next

(string t,

int next)

int i=

1,j=0;

//i表示字尾,j表示字首

next[i]=0

;while

(i)else

}

實質就是:子串自己和自己本身對比一下。

應用kmp演算法的模式匹配**如下:

//尋找s串pos位置後面和t串相同的子串位置

//沒找到就返回0

intindex_kmp

(string s,string t,

int pos)

else}if

(j >t[0]

)else

}

但是next陣列還不是最優的,如果子串中失配的地方,和字首元素一樣,說明不用再跳到當前字首元素的位置,因為字首元素過來也是失配,所以跳到字首元素的失配位址上

next陣列修改

void

get_nextval

(string t,

int next)

else

}else

}}

資料結構 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演算法,所以很多還明白的不是很透徹,在此記...