**:
簡單匹配演算法的時間複雜度為o(m*n);
kmp匹配演算法時間複雜度為o(m+n).。
一. 簡單匹配演算法
先來看乙個簡單匹配演算法的函式:
int index_bf ( char s [ ], char t [ ], int pos )
// if
else
k = next[k];
}// while
}// get_nextval
另一種寫法,也差不多。
void getnext(const char* pattern,int next)
}
下面是我寫的kmp模式匹配程式,各位可以用他驗證。記得加入上面的函式
#include #include int kmp(const char *text,const char* pattern) //const 表示函式內部不會改變這個引數的值。
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;i
下面是模式值使用第二種表示方法的匹配函式(next[0]=0)
int my_kmp(char *s, char *t, int pos)
{int i = pos, j = 0;//pos(s 的下標0≤pos
六.後話--kmp的歷史
cook於2023年證明的乙個理論得到,任何乙個可以使用被稱為下推自動機的計算機抽象模型來解決的問題,也可以使用乙個實際的計算機(更精確的說,使用乙個隨機訪問機)在與問題規模對應的時間內解決。特別地,這個理論暗示存在著乙個演算法可以在大約m+n的時間內解決模式匹配問題,這裡m和n分別是儲存文字和模式串陣列的最大索引。knuth 和pratt努力地重建了 cook的證明,由此建立了這個模式匹配演算法。大概是同一時間,morris在考慮設計乙個文字編輯器的實際問題的過程中建立了差不多是同樣的演算法。這裡可以看到並不是所有的演算法都是「靈光一現」中被發現的,而理論化的電腦科學確實在一些時候會應用到實際的應用中。
KMP字串模式匹配詳解
kmp字串模式匹配詳解 kmp字串模式匹配通俗點說就是一種在乙個字串中定位另乙個串的高效演算法。簡單匹配演算法的時間複雜度為o m n kmp匹配演算法。可以證明它的時間複雜度為o m n 一.簡單匹配演算法 先來看乙個簡單匹配演算法的函式 int index bf char s char t in...
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認為,對於...