KMP演算法詳解

2021-07-27 20:19:49 字數 1430 閱讀 4512

一直以來對kmp演算法理解的不是很透徹。看了左神的程式設計師**面試指南後感覺基本明白了。

我們都知道kmp演算法最重要的是next陣列,next[i]的含義是在match[i]之前的字串match[0..i-1]中,必須以match[i-1]結尾的字尾子串(不能包含match[0])與必須以match[0]開頭的字首子串(不能包含match[i-1])最大匹配長度是多少。比如match="aaaab",我們來求一下next[4],match[4]=='b',它之前的字串為"aaaa",根據定義它的字尾子串和字首子串的最大匹配為"aaa",所以next[4]=3.

假設從str[i]出發,匹配到j位置時發現與match中的字元不一致,此時,我們利用next陣列,next[j-i]表示match[0..j-i-1]這一段字串字首與字尾的最長匹配。假設字首是a區域這一段,字尾是b區域這一段,再假設a區域的下乙個字元是match[k],如圖所示。

那麼下次匹配時直接讓str[j]與match[k]進行匹配。相當於match向右滑動。如果match滑到最後也沒匹配出來,就說明str中沒有match,為什麼這樣做是正確的呢?

如圖,匹配到a字元和b字元才發生的不匹配,所以c區域等於b區域,有next陣列可知b區域與a區域相等,所以直接把字元c滑到a的位置開始匹配即可,那麼為什麼中間這一段是不用檢查的呢?

假設d區域開始的字元是不用檢查區域的乙個位置,如果從這個位置開始能夠匹配出match,那麼顯然d區域和e區域相等,假設d區域對應到match中是d'區域,也就是字元b之前字串的字尾,而e是match的字首,隨意對match來說,相當於找到了b字元之前字串的乙個比a,b區域更的大字首與字尾匹配長度,這與next陣列的值是自相矛盾的,因為next陣列儲存的就是最大字首與字尾匹配長度,所以如果next陣列的值計算正確,這種情況絕對不會發生。

匹配過程**

int getindexof(string& s,string& m)

next[0]=-1;

next[1]=0;

int pos=2;

int cn=0;

while(pos0)

cn=next[cn];

else

next[pos++]=0;

}for(int i=0;i

KMP演算法詳解

模式匹配的kmp演算法詳解 這種由d.e.knuth,j.h.morris和v.r.pratt同時發現的改進的模式匹配演算法簡稱為kmp演算法。大概學過資訊學的都知道,是個比較難理解的演算法,今天特把它搞個徹徹底底明明白白。注意到這是乙個改進的演算法,所以有必要把原來的模式匹配演算法拿出來,其實理解...

KMP演算法詳解

kmp演算法即knuth morris pratt演算法,是模式匹配的一種改進演算法,因為是名字中三人同時發現的,所以稱為kmp演算法。因為偶然接觸到有關kmp的問題,所以上網查了一下next陣列和 nextval陣列的求法,卻沒有找到,只有在csdn的資料檔案裡找到了next陣列的簡單求法 根據書...

KMP演算法詳解

相信很多人 包括自己 初識kmp演算法的時候始終是丈二和尚摸不著頭腦,要麼完全不知所云,要麼看不懂書上的解釋,要麼自己覺得好像心裡了解kmp演算法的意思,卻說不出個究竟,所謂知其然不知其所以然是也。經過七八個小時地仔細研究,終於感覺自己能說出其所以然了,又覺得資料結構書上寫得過於簡潔,不易於初學者接...