KMP演算法的思路闡述

2021-10-25 06:49:35 字數 1988 閱讀 7468

思路

主串和模式串進行匹配,當主串i指標所指的值與模式串j指標所指的值不同,這時已經比較的模式串中,假設j前面的一段與模式串從下標為[0]開始的一段重合,則可以直接把指標j從j處移至k處,使此時的主串i指標指的值與j指的值比較。

求next[j]的意義

方便讓j指的模式串的值在任何時候與主串的值對不上時,都可以將j移到k即next[j]。然後令新的j指向的值與i指標指的值比較。

具體實施

(1)初始化:

假設模式串為p。令指標j=0,k=-1。next[0]=-1(這一步賦值在後面的與主串的匹配中進行解釋)。將模式串中這乙個字串命名為a,這乙個字串命名為b。

(2)next[j]的賦值:

我們的目的是為了找到a和b相同的時候的k。假設我們已經找到了,我們下一步需要進行的操作就應該是,讓a和b對齊,然後此時a串的下一位即k+1應該替代掉b串的下一位即j+1,去和主串的值比較。所以可以寫出這裡的**:++k;++j;next[j]=k;

什麼條件下我們可以得到a和b相同呢?這裡我們考慮兩種情況:①特殊情況:即j指向的是p中下標為[0]和下標為[1]的值時,此時j前面沒有可以移動的餘地,即next[j]=0。②p[j]= =p[k]時,a和b這兩個字串是相同的。**表示:k==-1||p[j]==p[k]。

但是如果我們比較到p[k]和p[j]這個地方,它倆的值恰好不相等呢?這個時候我們可以明確的是,next[j]的值一定是小於當前的k的,但是我們怎麼找到這個新的k呢,即找到新的串a與新的串b相同。畫圖示意這種情況:

從上圖我們可以得到p[k]!=p[j]這種情況的意義——相當於b串為「主串」,a串為「模式串」,在匹配過程中,j指向的值和k指向的值不同,這時需要將k移動到新的位置,讓新的k指標指的值與j指的值比較→這不就是kpm演算法的目的嗎,也是求next[j]陣列的意義所在。

所以我們可以輕鬆知道,這個k移動的位置就是next[k]。

至此,我們的next陣列求解完畢。

給出求解next陣列的**:

(3)kmp演算法的實現

當模式串和主串匹配時,若相等,則指標向下移動(**為++i;++j;),若不相等,則j指標移動到next[j]處繼續比較(**為j=next[j])。

特殊情況:當j移動到next[j]= =-1的地方時,即移動到下標為[0]的位置。這個位置的意義是:若模式串的第一位就與主串對不上,則i下移一位,j從頭開始與其比較。→所以這裡也就指出了之前初始化next陣列時,將next[0]賦值為-1的意圖了,若這裡新的j為-1,i下移一位是++i;,而j從頭開始要求j==0,即++j。這樣就和匹配相同時的**一樣了。

給出kmp演算法的實現**:

kmp演算法的改進:

實際上就是對以下情況的改進:即next[j]所指向的值和j是相同的,這個時候的不需要比較即可知道不相等的。

改進步驟:

定義乙個nextval陣列,來儲存改進過後的next陣列。

考慮兩種情況:(1)next[j]所指向的值和j不相同的情況,nextval[j]=next[j];;(2)next[j]所指向的值和j相同的情況,nextval[j]=nextval[next[j]];。

給出求解nextval陣列的**:

KMP演算法解題思路

bf暴力演算法進行模式匹配由於需要回溯,導致演算法效率低,kmp演算法對其進行改進的一點就是在某趟匹配失敗後,主串不進行回溯,而子串回溯到某乙個位置k。子串的每乙個位置都對應著乙個k,要找出這些值,首先列出子串所有的字首,分別對每個字首找出其最長公共前字尾 需注意,最長公共前字尾必須小於原字首且要相...

KMP(思路分析)

介紹 kmp演算法是在給定的一串字串中查詢是否有目標串。分析 1 一般解法 對於以上問題,假如用樸素演算法,我們容易想到 用目標串 長度為n 的第1個字元依次與給定串 長度為m 的第1個至最後乙個字元對齊匹配,直到找到目標串為止。這樣演算法複雜度是m n。2 kmp演算法 思路分析 kmp演算法通過...

字串匹配的KMP演算法思路

日期 2013年5月 1日 字串匹配是計算機的基本任務之一。舉例來說,有乙個字串 bbc abcdab abcdabcdabde 我想知道,裡面是否包含另乙個字串 abcdabd 許多演算法可以完成這個任務,knuth morris pratt演算法 簡稱kmp 是最常用的之一。它以三個發明者命名,...