演算法 字串匹配之KMP

2021-07-24 15:40:14 字數 933 閱讀 1405

說人話就是——比如有乙個字串」bbc abcdab abcdabcdabde」,我想知道,裡面是否包含另乙個字串」abcdabd」。

許多演算法可以完成這個任務,kmp演算法是最常用的之一。

首先對於上面的「比如」,我們首先要針對搜尋詞」abcdabd「,算出一張《部分匹配表》。

接下來就很簡單了,將字串和搜尋詞都從頭開始乙個乙個依次比較就行了。

第一次,第乙個不同向後移動

第二次,還是不同再向後

第三次,找到第乙個相同了

就這樣,直到字串有乙個字元,與搜尋詞的第乙個字元相同為止(第三次)。

接著比較字串和搜尋詞的下乙個字元,還是相同。

直到字串有乙個字元,與搜尋詞對應的字元不相同為止。

這時,最自然的反應是,將搜尋詞整個後移一位,再從頭逐個比較。這樣做雖然可行,但是效率很差,因為你要把」搜尋位置」移到已經比較過的位置,重比一遍。

已知空格與d不匹配時,前面六個字元」abcdab」是匹配的。查表可知,最後乙個匹配字元b對應的」部分匹配值」為2,因此按照下面的公式算出向後移動的位數:移動位數 = 已匹配的字元數 - 對應的部分匹配值。因為 6 - 2 等於4,所以將搜尋詞向後移動4位。

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

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

程式設計實現

字串匹配之KMP演算法

以前零零散散做了些kmp的題目,一直也沒找出時間整理,這一段又開始研究字串了,就順便把kmp整理了一下。廢話不說了,我們直接入題。說到kmp,首先應該知道,它是一種字串查詢演算法,因為是由乙個姓k,乙個姓m和乙個姓p的人聯合發表的,所以就叫kmp演算法了。kmp演算法是一種線性時間的的字串匹配演算法...

字串匹配之KMP演算法

問題定義 字串匹配即是在所有文字t中,找出模式p的所有出現。字串匹配常用的演算法有 樸素演算法 rabin karp演算法 有限自動機演算法 kmp演算法 所有演算法中,算kmp演算法效率最高。也較為難理解。作者曾經認真看了3遍嚴蔚敏的 資料結構 遺憾的是沒有看懂,搞得我一度懷疑自己的智商很低。今天...

字串匹配之KMP演算法

include define maxsize 100 typedef struct sqstring void strassign sqstring s,char cstr 初始化串 s.length i void destroystr sqstring s 釋放串 void strcopy sqs...