資料結構筆記 KMP演算法及手工求解next陣列

2021-09-12 20:46:58 字數 3666 閱讀 9036

詳解找來找去感覺還是這兩篇解釋的很好

kmp演算法(1):如何理解kmp

kmp演算法(2):其細微之處

next[i]=j,即模式串p[1-i]的最長的相同真前字尾的長度

#include "stdafx.h"

#include "string"

#include "iostream"

using namespace std;

void getnext(string p, int next)

}int kmp(string s, string p, int next)

{ int i, j;

int pl = p.size();

int sl = s.size();

for (i = 0, j = 0; i < sl&& j < pl;)//注意這裡不要用j

以下兩種方法互通,分別為以0為初始或以-1為初始

1.以0為初始i

0123

4567

8910p

abab

aaab

abanext01

當i=0,1 next[0],next[1]分別初始為0,1

當i=2,p的前2位為ab

,因next[1]=1,則觀察ab的前1位和後1位是否相同,不同,所以next[2]=1(記住後面運算時若連1位相同都沒有則記為1,即最小記為1,其實看後面就知道意思是next[i]=0+1=1)

當i=3,p的前3位為aba,因next[2]=1,則觀察aba的前1位和後1位是否相同,相同,則在原基礎上+1,即next[3]=1+1=2當i=4,p的前4位為abab,因next[3]=2,則觀察abab的前2位和後2位是否相同,相同,則在原基礎上+1,即next[4]=2+1=3當i=5,p的前5位為ababa,因next[4]=3,則觀察ababa的前3位和後3位是否相同,相同,則在原基礎上+1,即next[5]=3+1=4當i=6,p的前6位為ababaa,因next[5]=4,則觀察ababaa的前4位和後4位是否相同,不相同,則在原基礎上-1,觀察前3位和後3位是否相同,不同繼續-1,直到觀察到前2位和後2位相同,若不同再繼續減,後觀察到前1位和後1位相同,則next[6]=1+1=2

當i=7,p的前7位為ababaaa,因next[5]=2,則觀察ababaaa的前2位和後2位是否相同,不相同,則在原基礎上-1,觀察前1位和後1位是否相同,相同,則next[7]=1+1=2……

… 最終為i01

2345

6789

10pab

abaa

abab

anext01

1234

2234

52.以-1為初始i

0123

4567

8910p

abab

aaab

abanext-10

當i=0,1 next[0],next[1]分別初始為-1,0

當i=2,p的前2位為ab,因next[1]=0,則next[1]+1=1,觀察前1位和後1位是否相同,不同,則1-1=0,到0為止,則next[2]=01-1=0中第乙個1的意思即前1位和後1位是否相同中的1)

當i=3,p的前3位為aba,因next[2]=0,則next[2]+1=1,則觀察的前1位和後1位是否相同,相同,則next[3]=1當i=4,p的前4位為abab,因next[3]=1,則next[3]+1=2,則觀察前2位和後2位是否相同,相同,則next[4]=2當i=5,p的前5位為ababa,因next[4]=2,則next[4]+1=3,則觀察前3位和後3位是否相同,相同,則next[4]=3當i=6,p的前6位為ababaa,因next[5]=3,則next[5]+1=4,則觀察前4位和後4位是否相同,不相同;則觀察前3位和後3位是否相同,不同;則觀察前2位和後2位是否相同,不相同;則觀察前1位和後1位是否相同,相同,則next[6]=1當i=7,p的前6位為ababaaa,因next[6]=1,則next[6]+1=2,則觀察前2位和後2位是否相同,不相同;則觀察前1位和後1位是否相同,相同,則next[7]=1………

最終為i0

1234

5678

910pa

baba

aaba

banext-10

0123

1123

4倆種方法的關係

觀察發現法1的next陣列每項+1就是法2的next陣列,所以考試時無論用哪一種都是可以的,只要分析或者看清是以什麼為初值就行

其實還可以理解為把法1的next陣列向右移1位,並把首位賦值位-1

資料結構筆記 KMP演算法

kmp演算法 每當一趟匹配過程中出現字元比較不等時,不需要回溯i指標,而是利用已經得到的部分匹配的結果將模式向右滑動盡可能遠的一段距離後,繼續比較 設主串為 s1s2s3.sn,模式串為p1p2p3.pm 需要解決的問題 當主串中第i和字元與模式串中第j個字元失配時,需要和模式串中哪個字元再比較?假...

資料結構 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,對於任何子串,第乙個...