KMP字串模式匹配詳解

2021-05-11 14:49:23 字數 1287 閱讀 2858

kmp字串模式匹配詳解

kmp字串模式匹配通俗點說就是一種在乙個字串中定位另乙個串的高效演算法。簡單匹配演算法的時間複雜度為o(m*n);kmp匹配演算法。可以證明它的時間複雜度為o(m+n).。

一.簡單匹配演算法

先來看乙個簡單匹配演算法的函式:

int index_bf ( char s [ ], char t [ ], int pos )

int *next=new int[len+1];

get_nextval(pattern,next);//求pattern的next函式值

int index=0,i=0,j=0;

while(text[i]!='/0' && pattern[j]!='/0' )

else }

}//while

delete next;

if(pattern[j]=='/0')

return index;// 匹配成功

else

return -1;      

}int main()//abcabcad

else if(t[j] != t[0])

else

}//while

for(int i=0;icout<}// myget_nextval

下面是模式值使用第二種表示方法的匹配函式(next[0]=0)

int my_kmp(char *s, char *t, int pos)

else             // a b a b c a a b c

// 0 0 0 1 2 0 1 1 2

}//while

if ( t[j] == '/0' )

return (i-j); // 匹配成功

else

return -1;

} // my_kmp

六.後話--kmp的歷史

[這段話是抄的]

cook於2023年證明的乙個理論得到,任何乙個可以使用被稱為下推自動機的計算機抽象模型來解決的問題,也可以使用乙個實際的計算機(更精確的說,使用乙個隨機訪問機)在與問題規模對應的時間內解決。特別地,這個理論暗示存在著乙個演算法可以在大約m+n的時間內解決模式匹配問題,這裡m和n分別是儲存文字和模式串陣列的最大索引。knuth 和pratt努力地重建了 cook的證明,由此建立了這個模式匹配演算法。大概是同一時間,morris在考慮設計乙個文字編輯器的實際問題的過程中建立了差不多是同樣的演算法。這裡可以看到並不是所有的演算法都是「靈光一現」中被發現的,而理論化的電腦科學確實在一些時候會應用到實際的應用中。

KMP字串模式匹配詳解

簡單匹配演算法的時間複雜度為o m n kmp匹配演算法時間複雜度為o m n 一 簡單匹配演算法 先來看乙個簡單匹配演算法的函式 int index bf char s char t int pos if else k next k while get nextval 另一種寫法,也差不多。voi...

KMP字串模式匹配詳解

kmp字串模式匹配詳解 kmp字串模式匹配通俗點說就是一種在乙個字串中定位另乙個串的高效演算法。簡單匹配演算法的時間複雜度為 o m n kmp 匹配演算法。可以證明它的時間複雜度為 o m n 一.簡單匹配演算法 先來看乙個簡單匹配演算法的函式 int index bf char s char t...

KMP字串模式匹配演算法詳解

kmp演算法簡介 kmp演算法是一種改進後的字串匹配演算法,由d.e.knuth與v.r.pratt和j.h.morris同時發現,因此人們稱它為克努特 莫里斯 普拉特操作 簡稱kmp演算法 通過乙個輔助函式實現跳過掃瞄不必要的目標串字元,以達到優化效果。傳統字串匹配演算法的缺憾 bill認為,對於...