KMP 演算法介紹

2021-10-11 23:46:11 字數 1864 閱讀 4652

kmp 是乙個解決模式串在文字串是否出現過,如果出現過,最早出現的位置的經典演算法

knuth-morris-pratt 字串查詢演算法,簡稱為 「kmp 演算法」,常用於在乙個文字串 s 內查詢乙個模式串 p 的

出現位置,這個演算法由 donald knuth、vaughan pratt、james h. morris 三人於 1977 年聯合發表,故取這 3 人的

姓氏命名此演算法.

kmp 方法演算法就利用之前判斷過資訊,通過乙個 next 陣列,儲存模式串中前後最長公共子串行的長度,每次

回溯時,通過 next 陣列找到,前面匹配過的位置,省去了大量的計算時間

 字串匹配問題::

有乙個字串 str1= 「bbcabcdab abcdabcdabde」,和乙個子串 str2=「abcdabd」

現在要判斷 str1 是否含有 str2, 如果存在,就返回第一次出現的位置, 如果沒有,則返回-1

要求:使用 kmp 演算法完成判斷,不能使用簡單的暴力匹配演算法.

5.遇到 str1 有乙個字元與 str2 對應的字元不符合。

7.怎麼做到把剛剛重複的步驟省略掉?可以對 str2 計算出一張《部分匹配表》,這張表的產生在後面介紹

10.因為空格與 a 不匹配,繼續後移一位。

11.逐位比較,直到發現 c 與 d 不匹配。於是,移動位數 = 6 - 2,繼續將搜尋詞向後移動 4 位。

13.介紹《部分匹配表》怎麼產生的

先介紹字首,字尾是什麼

「部分匹配值」就是」字首」和」字尾」的最長的共有元素的長度。以」abcdabd」為例,

-」a」的字首和字尾都為空集,共有元素的長度為 0;

-」ab」的字首為[a],字尾為[b],共有元素的長度為 0;

-」abc」的字首為[a,ab],字尾為[bc, c],共有元素的長度 0;

-」abcd」的字首為[a,ab, abc],字尾為[bcd, cd, d],共有元素的長度為 0;

-」abcda」的字首為[a,ab, abc, abcd],字尾為[bcda, cda, da, a],共有元素為」a」,長度為 1;

-」abcdab」的字首為[a,ab, abc, abcd, abcda],字尾為[bcdab, cdab, dab, ab, b],共有元素為」ab」,

長度為 2;

-」abcdabd」的字首為[a,ab, abc, abcd, abcda, abcdab],字尾為[bcdabd, cdabd, dabd, abd, bd,

d],共有元素的長度為 0。

14.」部分匹配」的實質是,有時候,字串頭部和尾部會有重複。比如,」abcdab」之中有兩個」ab」,那麼

它的」部分匹配值」就是 2(」ab」的長度)。搜尋詞移動的時候,第乙個」ab」向後移動 4 位(字串長度-

部分匹配值),就可以來到第二個」ab」的位置。

到此 kmp 演算法思想分析完畢!

KMP演算法詳細介紹及Java實現

kmp是三位大牛 d.e.knuth j.h.morris和v.r.pratt同時發現的。其中第一位就是 計算機程式設計藝術 神作的作者。kmp演算法要解決的問題就是在字串 也叫主串 中的模式 pattern 定位問題。說簡單點就是我們平時常說的關鍵字搜尋。模式串就是關鍵字 接下來稱它為p 如果它在...

演算法 KMP演算法

kmp演算法主要解決的問題就是在字串 主串 中的模式 pattern 定位問題。記主串為t,模式串為p,則kmp演算法就是返回p在t 現的具體位置,如果沒有出現則返回 1。如果 i 指標指向的字元和 j 指標指向的字元不一致,那麼把 i 右移1位,j 從0位開始,從新開始匹配 如果 i 指標指向的字...

kmp演算法next例題 KMP演算法next陣列求解

kmp演算法與bf演算法的比較 bf演算法的想法十分樸素,即先將子串t的第一位與主串s的第一位對齊開始匹配,當不能匹配時將子串整體往後移一位,然後重新匹配,以此類推直至排出結果 如當遇到下圖所示情況時,需將子串整體後移一位,將i,j分別回溯到主串第2位和子串第一位。kmp演算法 對bf進行思考後,我...