KMP演算法之k next Pk

2021-08-05 00:00:01 字數 821 閱讀 3720

最近在看《大話資料結構》,在串這章中,講到關於kmp演算法。其中關於在一直前j個next值,如何求得j+1的值,有個公式一直不是很理解,後來查了下資料,終於搞懂了。

模式字串記為p(下標從0開始),next[q] = k 表示p[q]之前的子串中,存在長度為k的相同字首和字尾,即p[0]~p[k-1]與p[q-k]~p[q-1]依次相同。如果p[k] = p[q],那麼next[q+1] = k+1,此時表示p[q+1]之前的子串中,存在長度為k+1的相同前字尾,這應該不成問題。下面貼張圖詳細表示:

如果p[k] != p[q],那麼說明next[q+1] 不會是 k+1,也就是說p[q+1]之前的子串中,不會存在長度為k+1的相同前字尾。那麼我們就要去尋找長度更短的相同前字尾,假設長度為j,此時p[0]~p[j-1]和p[q-j]~p[q-1]依次相同。下面再貼張圖:

接著我們比較p[q]和p[j]是否相同,如果相同,則next[q+1] = j+1;如果不同,則按照k = next[k]遞迴查詢。說到這,大家應該可以看出這裡的j = next[k]。如果還不明白,看看next陣列的定義,next[k] = j 表示p[k]之前的子串中,存在長度為j的相同前字尾。從圖2可以看出,p[0]~p[j-1]和p[k-j]~p[k-1]是依次相同的。

演算法之KMP

kmp演算法是一種字串匹配演算法,時間複雜度為 m n 個人對演算法學習還在初級階段。以前對字串匹配用暴力匹配演算法。暴力匹配演算法 兩個字串,模板串mo和文字串s。如果用暴力演算法,對於模板串mo,用i表示模板串匹配的位置。用j表示文字串匹配的位置。1,如果從一開始匹配的上,i和j同時增加。2,當...

hihoCoder之KMP演算法

本分類記錄了本人在hihocode上面嘗試的結果,現在分享出來,大家一起學習。小hi和小ho是一對好朋友,出生在資訊化社會的他們對程式設計產生了莫大的興趣,他們約定好互相幫助,在程式設計的學習道路上一同前進。這一天,他們遇到了乙隻河蟹,於是河蟹就向小hi和小ho提出了那個經典的問題 小hi和小ho,...

初探KMP演算法之next nextval

這種演算法是d.e.knuth與v.r.pratt和j.h.morris同時發現的,因此人們稱它為克努特 莫里斯 普拉特演算法 簡稱為kmp演算法 此演算法可以在o m n 的時間數量級上完成串的模式匹配操作。其改進在於 每當一趟匹配過程中出現字元比較不等時,不需要回溯 i 指標,而是利用已經得到的...