一點關於KMP演算法的思考

2021-09-20 03:31:24 字數 683 閱讀 4472

演算法用途:匹配字串。

給定乙個模式串(pattern string):ababc

乙個待匹配串:abababc

最樸素的方法就是兩層迴圈,從左到右依次比較,時間複雜度為o(m*n)

kmp演算法:

給定乙個模式串(pattern string):ababababc

觀察模式串

如果有乙個待匹配串是am,第2位匹配不上,重新匹配。

那麼我們就給模式串第一位的j值設為0,也就是說,已匹配好1位,匹配第1+1=2位時失敗了重新開始。

如果有乙個待匹配串是abm,第3位匹配不上,重新匹配。

如果有乙個待匹配串是abam,第4位匹配不上,我們發現第3位可以當第1位來使用

因此我們就給模式串第4位的j值設為1,那麼就相當於計算機跳到第1位開始配。

如果有乙個待匹配串是ababm,第5位匹配不上,我們發現第4位可以當第2位來使用

因此我們就給模式串第4位的j值設為2,那麼就相當於計算機跳到第2位開始配。

以此類推

參考

關於演算法的一點思考。。。

關於演算法的一點思考。在實踐過程中,我發現 有時候要解決乙個問題,可以設計幾個演算法分步完成任務,這樣處理起來比較簡單,但是情況並非總是如此,有時,我們需要將幾個步驟放在同乙個演算法內連帶處理,這樣才比較容易處理問題。我還發現,有時候,解決問題的演算法,是被發現出來的,並加以一步一步的檢驗才得以確定...

關於makefile的一點思考

在gnu編譯工具軟體中,如果對單一的原始檔進行編譯,可執行指令如下 gcc o x x.c 此指令會將原始檔編譯為目標檔案。若是對執行緒類檔案進行編譯,則在末尾加上 lpthread指令。但若是對多檔案進行編譯,即若是編譯的目標檔案同時包含另一檔案中的函式。則在編譯的時候需將另一檔案加到編譯原始檔中...

關於指標的一點思考

指標是乙個變數,所不同的是,它存的是位址。因為資料型別決定著如何解釋這個位址 位元組數和操作 因此根據的資料型別的不同,指標又有不同的型別。某個物件 a 的位址範圍為 a,a size n 其中size n是a所佔的位元組數 比如乙個一維陣列int a 10 位址範圍為 a,a 10 sizeof ...