字串查詢KMP演算法

2022-07-10 02:09:07 字數 706 閱讀 6546

如果你用過ctrl+f這個快捷鍵,那麼你有很大的概率使用過這個演算法,這就是在待查詢字串(可能有成千上萬個字元)中找出模式串(比較小,可能有幾個字元),可能找到大於或者等於1次的位置。例如,在ababcd中找出abc。這裡介紹演算法思想,只給出了第一次出現的位置。

void find(char t,char

p)else

}if(j==n)

}}

kmp演算法是這中演算法的改進,在於不是i不是每次都移動乙個位置,而是盡可能多的向後移動從而提高匹配效率。到底移動多少個位置,這就是kmp演算法的關鍵。kmp演算法維護了乙個和模式串長度相同的陣列,這個陣列表示當前匹配到底最大字首長度。比如abacab的最大字首長度就是2,分別是字首ab,字尾ab。而陣列next就是[0,0,1,0,1,2],可以利用這個資訊直接跳過已經匹配到的字首。

void makenext(char p,int

next)

if(p[q]==p[k])

next[q] =k;

}}void kmp(char t,char

p); makenext(p,next);

int i=0,j=0;//

i是匹配串的下標,j是模式串的下標

while(istrlen(p))

else

}if(j>=strlen(p))

else

}

字串查詢演算法kmp

字串查詢最簡單的方法就是乙個乙個地 滑動 查詢。這樣查詢演算法複雜度可定很高,假設pattern的長度為m,文字txt的長度為n,那麼演算法複雜度為o m n m 1 kmp模式搜尋演算法 kmp knuth morris pratt 我只認識knuth,大名鼎鼎的高納德老頭子嘛。kmp演算法的基本...

字串查詢演算法kmp

給定乙個文字串s,和乙個匹配串p,要求查詢p第一次在s中出現的位置。常見的方法如暴力搜素,逐個匹配s i p j 若匹配,下標後移。不匹配,i回溯到這次匹配前的下一位置,j置為0,重新匹配。最壞情況,時間複雜度o n m int violencesearch char s,char p else i...

KMP 演算法 字串查詢演算法

knuth morris pratt algorithm 克努斯 莫里斯 普拉特 演算法 克努斯 莫里斯 普拉特演算法 部分匹配表 字首 指除了最後乙個字元以外,乙個字串的全部頭部組合 字尾 指除了第乙個字元以外,乙個字串的全部尾部組合 部分匹配值 就是 字首 和 字尾 的最長的共有元素的長度。以 ...