kmp匹配之葵花寶典法

2021-07-28 09:47:41 字數 894 閱讀 3931

小弟昨天看了一下午串的匹配,可是仍是看不懂kmp的思想,對kmp知其然但不知其所以然,只好練此葵花寶典,以求速成。

注意j,k都為下標, 我不會輸入,所以只能表現為pj,pk這種形式。

kmp中最關鍵的便是求next[j]的值,(next[j]的值之與他的模式串有關,就是說只要知道模式串就能知道next[j]的值),在書上next[j]的值總共有3種情況(j從1開始的):1,當j==1時,next[j]=0 .

2,當j==2或者pj之前沒有匹配部分,next[j]等於1。

第3種,也是最重要的情況,max{k|k廢話不多說,看個例子:

這個模式串:a,b,a,b,a,c

它的next[j]求法:  j=1時,顯然由公式知next[j]=0,滿足第一種情況

j=2時,next[j]=1,滿足第2種情況

j=3時,當k=2時,p1!=p2  (第乙個a不等於第1個b)   ,滿足第2種情況

j=4時,當k=2時,p1!=p3,當k=3時,p1p2!=p2p3(即ab!=ba),滿足第2種情況

...按此來,求完,即可得出next[j]的值。

上面是速成方法,下面是寫**的演算法。

求next[j]的演算法如下

1:next[1]=0

2:next[j]=k,1在2的情況下,1:若pk=pj,則next[j+1]=k+1=next[j+1]。(注意,k值即為next[j]的值)

2:pk!=pj,用pnext[k]與pj比較,若pnext[k]=pj,則則next[j+1]=next[k]+1若不等於,繼續重複在2情況下的2,直到相等或滿足初始條件next[1]=0(此處我不懂,這是不懂原理惹的禍)。

kmp匹配的原理,已經比較到主串的第i個字元和模式串的第j個字元,若不等,next[j]賦給j,繼續與此時的下標i所對應的字元比較。

葵花寶典 Flume

2 配置樣例 定義agent的名字 source channel sink a1.sources r1 a1.sinks k1 a1.channels c1 配置source 查閱官網 a1.sources.r1.type netcat a1.sources.r1.bind localhost a1...

葵花寶典 kafka

kafka是乙個分布式的基於發布 訂閱模式的訊息佇列,主要應用於大資料實時處理領域。producer 生產者,向kafka傳送資料 consumer 消費者,消費kafka內的資料 consumer group 消費者組,消費者組內的消費者負責消費不同分割槽的資料,乙個分割槽只能由乙個消費者消費,乙...

葵花寶典完全解析!

欲練神功,揮刀自宮。這是絕世神功 葵花寶典 的入門法則,聲稱要練這門神功的人必須先揮刀割掉自己的jj才能入門,殊為恐怖,於是早就了江湖上不少仁人志士為了練就神功,不惜捨棄人世間最重要的一項生活,忍痛割愛。然而,真的必須割麼?經過研究和思考,我發現乙個驚天秘密,其實中原的武林人士都對寶典的這句入門法則...