自學了一段時間,剛剛準備轉行做軟體開發,面試過程中被指出計算機基礎知識薄弱。因為是非科班出生,確實有些計算機方面的基礎沒有學過,也開始惡補這些方面的東西。
最近在學習資料結構與演算法過程中,學到kmp演算法,甚是難解。看了阮一峰的網路日誌後才慢慢理解,但也發現其中的瑕疵,在此也順帶指出,至於對或不對,還請各位看客指正。
和例子講解均引自阮一峰的網路日誌,稍作修改,侵改。舉例來說,有乙個字串」bbc abcdab abcdabcdabde」,我想知道,裡面是否包含另乙個字串」abcdabd」,即字串」abcdabd」是否是字串」bbc abcdab abcdabcdabde」的子串。
定義
這種方法簡單粗暴,但效率極低。
移動位數 = 已經匹配對的字元數 - 最後乙個匹配對的部分匹配值+ 當前匹配錯的部分匹配值部分匹配表
下面介紹 部分匹配表 是如何產生的
「部分匹配值」就是」字首」和」字尾」的最長的共有元素的長度。以」abcdabd」為例,
「部分匹配」的實質是,有時候,字串頭部和尾部會有重複。比如,」abcdab」之中有兩個」ab」,那麼它的」部分匹配值」就是2(」ab」的長度)。搜尋詞移動的時候,第乙個」ab」向後移動4位(字串長度-部分匹配值),就可以來到第二個」ab」的位置。
KMP 演算法(個人理解)
相信大家看了 matrix67 的講解,一定已經知道了 kmp 演算法是怎麼回事,怎麼操作的,為什麼時間複雜度不高 這裡,我主要是分享我對 kmp 的理解 kmp 的精髓是什麼?這個東西,各自有個字的理解,很多人都覺得是避免了重複匹配,而我的理解是預處理 為什麼是預處理?你看看 kmp 的執行過程 ...
KMP演算法的個人理解
kmp演算法是一種改進的字串匹配演算法,由d.e.knuth,j.h.morris和v.r.pratt同時發現,因此人們稱它為克努特 莫里斯 普拉特操作 簡稱kmp演算法 kmp演算法的關鍵是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。kmp演算法的核心內容是乙個部分匹...
個人理解的kmp演算法
kmp還是挺難上手的,看書加看部落格,看了有五六篇才理解,看了大概四個小時。include include include using namespace std next陣列本質是模式串中的字首和字尾的相等數 int next 555 得到next陣列的過程也是模式串自身匹配的過程 void ge...