關於KMP學習筆記 2019 7 26

2022-04-14 06:11:17 字數 1020 閱讀 2825

網上一堆「形象」部落格浪費我一堆時間,果然以前摸的魚現在還得還qaq

我來講我對於kmp演算法的自己理解

首先宣告一下,kmp演算法最關鍵的地方不在於匹配,而在於求模式串的最長匹配前字尾,

在網上的其他部落格上,這個「最長匹配前字尾」的名字被替換成了「nxt」,而導致部落格十分的「好懂」

wdnmd我怎麼知道nxt是什麼

想一想求乙個字串最長匹配前字尾的最差複雜度是多少?$o(n)$?

是$o(n^2)$啊帶哥,列舉長度$o(n)$,判斷是否匹配$o(n)$,簡直爛到爆

而kmp演算法是求出乙個字串$\s$,以位置$\i$為尾的最長匹配前字尾$(1<=i<=strlen(s))$

複雜度難以置信的是$\o(nlogn)$,肥腸優秀,而且不是很難學

kmp最關鍵**如下

//b[i]是模式串,nxt陣列就是最長匹配前字尾長度

void make_nxt()

return ;

}

一邊看一邊說,主要的是,j是當前位的最長匹配前字尾長度,將j維護好之後,賦值給nxt就好

現在的問題就是怎麼維護j了,

剛開始到達這一位的時候,j是上一位的最長匹配前字尾中字首尾的位置,

如果b[j+1] == b[i],即上一位的再往後走一位仍然匹配,那麼直接這一位的最長匹配前字尾的長度就是上一位+1,

如果失配,那麼該怎麼辦?仔細想想,j當前所在的位置的最長匹配前字尾的字首尾是不是可以作為下一次嘗試地點?

為什麼?因為是匹配前字尾,所以縮回去到字首的位置時,字首以前的肯定全都匹配,我們只要看下一位匹不匹配就行了。

啊,世界明朗。

我咕了,這部分您自己推一推吧,或者去康康其他部落格,上面看懂了這裡比劃一下就出來了

有些題讓我們求兩個字串的最長匹配前字尾,我們可以把兩個字串拼在一起,然後跑乙個kmp

注意兩個字串拼接時中間要插1個奇怪不同字元來把字串隔離,防止出鍋(乙個就行,思考前字尾的匹配方式)

tag : sin_xiii

關於KMP的筆記

今天資料結構課上講了kmp演算法,課上不是很理解,現在在紙上推算了一遍寫下來以供將來複習用。void getnext char s2,int next else intkmp char s1,char s2,int next else if j lens2 else int main char s1...

學習筆記 KMP

kmp用於在乙個字串中尋找乙個模式串。kmp詳細講解 一 演算法思想 下標從0開始 當我們需要在乙個字串中s找乙個模式串p是否出現的時候,最容易想到的就是暴力 列舉左端點,然後從這個點開始匹配,失敗則換下乙個左端點 如圖所示 我們先匹配了a b c並且都成功了。但下一位d a,所以我們需要重新在s中...

KMP學習筆記

最近在搞這個東西,不知道為啥,看一遍sb一遍。終於在今天下午從宿舍裡猛的一起,狂奔到機房中,還在懵逼狀態下的我終於搞懂了這個演算法。縱觀全網,kmp雖然是個很老很經典的演算法,部落格關於它的講解也不少,我就把我的理解寫一遍,希望對大家有所幫助。首先kmp這個東西是幹啥使的呢?比如你在打亡者農藥,你方...