kmp演算法理解

2021-07-10 03:44:59 字數 763 閱讀 7883

宣告:下面兩段**摘自 結構之法 演算法之道 博主july大神的部落格。這裡,我只標記和注釋一下**,算是自己的學習心得吧。

//優化過後的next 陣列求法  

void getnextval(char* p, int next)

else

} }

求next陣列,初始時 next[0] = -1,這個是固定的,k為當前最新求得的最長公共字串前字尾長度(可能已優化到最佳,也可能還未優化)。j從0開始,根據當前字元p[j]與p[k]是否相等,實際求得的是next[j+1]的值,因此迴圈小於plen-1即可。p[i] == p[k], next[i+1] = next[i] + 1 = k + 1,否則next一直往前回溯,即 k = next[k],直到第0個字元,即k = -1。此外,這裡對next陣列有乙個優化,即p[j] != p[k],否則next[j]也要往前回溯。july大神說要一直回溯,但從**執行來看,只回溯了一步,並未像k值一樣,一直回溯到頭。這裡,我按自己的理解補充一下,因為:通過遞推,我們確保p[next[k]] != p[k],而p[k] == p[j],所以一定有p[j] != p[next[k]]。

int kmpsearch(char* s, char* p)  

else

} if (j == plen)

return i - j;

else

return -1;

}

KMP演算法理解

kmp演算法的理解著實花了不少時間,幸好網上前輩的部落格寫得都相當好,結合幾篇部落格仔細想想還是可以理解的,這裡僅做一下整理。kmp演算法概念理解看這篇部落格就夠了字串匹配的kmp演算法by阮一峰 主要的邏輯那篇部落格都有講,求出next陣列,進行簡單的加減即可完成匹配。至於求解next陣列,則是k...

KMP演算法理解

kmp演算法是對普通模式匹配演算法的一種改進演算法,這種改進演算法是d.e.knuth與v.r.pratt和j.h.morris同時發現的,因此人們稱它為kmp演算法。kmp演算法最大的特徵就是引進了跳轉表 next表 下面我們來說說kmp演算法與普通演算法的區別。這裡我們先提乙個已知條件 目標串 ...

KMP演算法理解

在已知 母串 長度為n 中尋找 子串 長度為m 與在給定集合中尋找特定子集類似,但不同。暴力搜尋 類似滑動匹配 思路簡單,網上很多講解,不贅述。時間複雜度為o n m kmp模式匹配 充分利用 子串 特性,時間複雜度為o n m 發生匹配失敗時,子串滑動至 已匹配成功串 的 最長公共字尾 位置。在c...