KMP演算法深入理解

2021-07-14 17:04:32 字數 1112 閱讀 7972

knuth-morris-pratt演算法

(簡稱kmp)是最常用字元傳匹配演算法之一。它以三個發明者命名,起頭的那個k就是著名科學家donald knuth。

kmp演算法對於任何模式和目標序列,都可以在

線性時間

內完成匹配查詢,而不會發生退化。

1、kmp演算法的原理

kmp演算法中主要的概念是next陣列,有的叫失配函式,用來計算子串與母串匹配失敗時子串移動的位數。kmp演算法就是利用next陣列來提高效率,不用每次匹配失敗時一位一位地往下移。

字串匹配的一般步驟

kmp演算法中的匹配步驟

next陣列的含義

公共最長部分:字首字尾相同的最大長度

2、匹配失敗時,子串指標移動到最大長度+1位置原因,怎麼保證了不會遺漏

3、next陣列構造**的理解

next[0]=-1;

k=-1;

j=0;

if(k==-1||t[k]==t[j])

else

k表示字首指標,j表示字尾指標。next[j]的求解首先在next[j-1]的基礎上處理,因為next[j]的最大值只能比next[j-1]大1。假設可能大2,可以推出j-1的next值可以取到next[j-1]+1,大於next[j-1],產生矛盾。

如果字首和字尾新加的乙個字元是相等的,next[j]等於next[j-1]加1。

如果不相等,k指標跳到next[k],這一步是用來找此時可能存在的最大公共最長部分即next[k]+1。首先跳到next[k]可以保證不會存在更大的公共最長部分,因為如果為next[k]+2,則k指標位置的next值可以取到next[k]+1,產生矛盾。其次跳到next[k]的位置和kmp演算法匹配失敗跳轉位置選擇的原理類似,可以減少計算量。

4、kmp演算法的優化

kmp演算法的原理是匹配失敗時,母串指標i不變,子串指標由j跳轉到next[j]的位置。匹配失敗時是s[i]與t[j]比較,而如果t[next[j]]與t[j]相同,則跳轉前後的比較情況是一樣的都不相等,還需要在再跳轉一次。故可以給next陣列進行優化,如果t[next[j]]與t[j]相同,next[j

]的取值為next[next[j]],即next[k]。

if(k==-1||t[k]==t[j]) }

KMP演算法 深入理解next陣列

在kmp演算法中有個陣列,叫做字首陣列,也有的叫next陣列。每乙個子串有乙個固定的next陣列,它記錄著字串匹配過程中失配情況下可以向前多跳幾個字元。當然它描述的也是子串的對稱程度,程度越高,值越大,當然之前可能出現再匹配的機會就更大。這個next陣列的求法是kmp演算法的關鍵,但不是很好理解。這...

KMP演算法 深入理解next陣列

在kmp演算法中有個陣列,叫做字首陣列,也有的叫next陣列。每乙個子串有乙個固定的next陣列,它記錄著字串匹配過程中失配情況下可以向前多跳幾個字元。當然它描述的也是子串的對稱程度,程度越高,值越大,當然之前可能出現再匹配的機會就更大。這個next陣列的求法是kmp演算法的關鍵,但不是很好理解。這...

深入理解KNN演算法

1.knn是個 消極 演算法,y f x1,x2,xp,x 其中x1,x2,xp是訓練資料,x是待分類或回歸查詢例項,y是分類或回歸結果.整個過程中沒有建立任何數學模型.2.與 積極 演算法的乙個關鍵差異 knn可以為不同的待分類查詢例項建立不同的目標函式逼近.3.knn的唯一假設,函式f是平滑的....