39 KMP執行過程

2022-08-02 08:12:15 字數 1212 閱讀 8636

建議去看原文,下文只摘出了kmp過程且做了少許修改;

那麼普通的匹配是怎麼操作的呢?當然就是一位一位地比啦。(下面用藍色表示已經匹配,黑色表示匹配失敗)

但是我們發現這樣匹配很浪費!為什麼這麼說呢,我們看到第 4 步:

在第 4 步的時候,我們發現第 3 位上 c 與 a 不匹配,然後第 5 步的時候我們把 b 串向後移 1 位,再從第 1 個開始匹配

這裡就有乙個對已知資訊很大的浪費,因為根據前面的匹配結果,我們知道 b 串的前 2 位是 ab,所以不管怎麼移,都是不能和 b 匹配的,所以應該直接跳過對 a 串第 2 位的匹配,對於 a 串的第 3 位也是同理

再舉乙個例子

字首:指的是字串的子串中從原串最前面開始的子串,如 abcdef 的字首有:a,ab,abc,abcd,abcde

字尾:指的是字串的子串中在原串結尾處結尾的子串,如 abcdef 的字尾有:f,ef,def,cdef,bcdef

當然讀者可以通過手動模擬得出只有乙個地方匹配

那麼我們根據手動模擬,同樣可以計算出各個 f 的值

我們再用 i 表示當前 a 串要匹配的位置(即還未匹配),j 表示當前 b 串匹配的位置(同樣也是還未匹配),補充一下,若 i>0 則說明 i-1 是已經匹配的啦( j 同理)

這就是kmp演算法的全過程

另外強調一點,當我們將 b 串向後移的過程其實就是 i++ ;而當我們不動 b,而是匹配的時候,就是i++,j++,這在後面的**中會出現,這裡先做乙個說明

擴充套件KMP 記錄學習過程

首先看了幾篇部落格,發現還得耐下心來理解,動手畫圖 才能理解倆字串還有陣列之間神奇的關係 這篇部落格圖不錯 擴充套件kmp 一開始假設求出了 next陣列,然後去求extend陣列,然後方法一樣 next陣列可以自己求自己 include include define s 1000 define t...

KMP演算法的實現過程

樸素的字串匹配演算法的時間複雜度為o m n m n分別為主串 模式串的長度。容易理解的是,主串和模式串的指標同步進行,當遇到不匹配的字元時,主串指標將移動到當前指標下一位,因此最壞情況下m個字元都要匹配n次。而kmp演算法能在o m n 的時間複雜度內完成查詢,原理不再介紹,下面介紹實現過程。1 ...

init執行過程

一。init init是核心啟動後執行的第乙個應用程式,主要工作就是完成對一系列作業系統啟動時就需要執行的應用程式的呼叫。init的原始碼在sysvinit包中,可以從http freshmeat.net projects sysvinit 獲得更多資訊。當然在linux世界裡,還有其它型別的ini...