DSA KMP演算法字元匹配

2022-08-03 09:54:09 字數 1387 閱讀 8068

//日有感!

上:     第 34分鐘開始 

下: 嚴蔚敏雖然嚴老師講話速度慢些,最開始會覺得不耐煩,甚至想快進什麼的,但是對我而言,正因為腦袋不那麼太靈光才會看那麼多都不懂,嚴老師慢慢的講解正好彌補了

我跟不上思路的毛病!簡直完美!

目標字串 t

模式字串 p

樸素的匹配演算法很好懂,就是先比較t和p的第一位如果不匹配就把p後移一位····

看完 仍覺得部分匹配表的部分不是很清晰,繼續查

理解了一下做此記錄

模式p:       a b c d a b d

部分匹配值:0 0 0 0  1  2 0

怎麼得到的呢

是以第乙個字元當前字元的字首 和字尾 的最長的共有元素的長度

a:「a」的字首null,字尾 null------沒有共有元素-----長度=0

b: 「ab」的字首[a] 字尾[b]------沒有共有元素----長度=0

c:「abc」的字首[a,ab],字尾[bc,c]------沒有共有元素------長度=0

d:「abcd」的字首[abc,ab,a],字尾[bcd,cd,d]------沒有·····長度=0

a:「abcda」字首[abcd,abc,ab,a],字尾[bcda,cda,da,a]-----有共有元素了!a!所以最長共有元素長度!=1

b:「abcdab」字首[abcda,abcd,abc,ab,a]字尾[bcdab,cdab,dab,ab,b]---還有共有元素,只有乙個 是ab 長度=2,所以最長的=2

d:「abcdab,abcda,abcd,abc,ab,a」 [bcdabd,cdabd,babd,abd,bd,d]-----共有元素。。沒有,所以=0

根據反證法【具體咋證明的我也沒證····】

next[j+1]<=next[j]+1;

特別的,當且僅當p[j]=p[next[j]]時候,取等號 即 next[j+1]==next[j]+1

原因如下:還是沒太搞清楚原因。

p模式串 p[0,j-1],   (j),    p[j,m]

p模式串p[0,next[j] ],     (j+1),      p[j+2,m]

*號代表配上的了,而

所以根據這一點就可以用遞推,來計算next了

public

intkmp(string p,string t)

else p=next[p];

}return t-p;

}public

int buildnext(string p)

else t=next[t];//

/失配}

return

next;

}

c kmp演算法字元匹配 KMP模式匹配演算法

我從對暴力匹配演算法的優化角度出發,理解和構造出kmp演算法。模式匹配問題中,有主串,子串,模式串,字首,字尾,部分匹配值等等概念。教材往往 反著來 先有解決方案和概念,再強行說 啊,就是這樣子的 但我們都應該清楚,概念是輔助思考,輔助解決遇到的問題的。假設我們已經弄懂了暴力匹配解決模式匹配的方法,...

字元匹配BF演算法

include include include bf演算法 brute force演算法 屬於樸素的模式匹配演算法,它的核心思想 有兩個字串s和t,長度為n和m。首先s 1 和t 1 比較,若相等,則 再比較s 2 和t 2 一直到t m 為止 若s 1 和t 1 不等,則t向右移 動乙個字元的位置...

字元匹配kmp演算法

前言 之前對kmp演算法雖然了解它的原理,即求出p0 pi的最大相同前字尾長度k 但是問題在於如何求出這個最大前字尾長度呢?我覺得網上很多帖子都說的不是很清楚,總感覺沒有把那層紙戳破,後來翻看演算法導論,32章 字串匹配雖然講到 了對前1.kmp演算法的原理 本部分內容 字串匹配是計算機的基本任務之...