C KMP演算法手工實現

2021-10-03 15:55:03 字數 1595 閱讀 7524

推薦閱讀徹底搞懂kmp演算法原理

本文採用下標0開始的陣列來實現next陣列,下標1開始的**以注釋表示。

主串:ababcabcacbab

模式串:abcac

計算所得next陣列:-1 0 0 0 1

next陣列**:

void

get_next

(int next,

char str)

else

}}

查詢模式串位置模板

int

findpos

(char a,

char b,

int pos,

int next)

if(jreturn-1

;//查詢失敗返回-1

else

return i-

strlen

(b);

}

#

include

#include

#define

maxsize

100//陣列最大長度

char stra=

"ababcabcacbab"

;//主串

char strb=

"abcac"

;//模式串

int lena,lenb;

//串長

int kmp[maxsize]

;//next陣列

void

get_next

(int next,

char str)

else}}

intfindpos

(char a,

char b,

int pos,

int next)

if(jreturn-1

;//查詢失敗返回-1

else

return i-lenb;

}int

main()

printf

("\nsublist's position:%d"

,findpos

(stra,strb,

0,kmp));

//輸出下標

return0;

}

mainstring:ababcabcacbab

substring:abcac

nextlist:-1

0001

sublist's position:

5

設主串和模式串長度分別為m,n

kmp演算法的時間複雜度是o(m

+n

)o(m+n)

o(m+n)

,而bf演算法的時間複雜度為o(m

n)

o(mn)

o(mn

),但是實際上bf演算法在計算機執行時間近似於o(m

+n

)o(m+n)

o(m+n)

,所以bf演算法仍然廣泛使用,kmp演算法比較適合主串和模式串有很多「部分匹配」的情況。

C KMP演算法的實現

kmp演算法是一種改進的 字串匹配 演算法,由d.e.knuth,j.h.morris和v.r.pratt同時發現,因此人們稱它為 克努特 莫里斯 普拉特操作 簡稱kmp演算法 kmp演算法的關鍵是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現就是實現乙個next...

c kmp演算法字元匹配 KMP模式匹配演算法

我從對暴力匹配演算法的優化角度出發,理解和構造出kmp演算法。模式匹配問題中,有主串,子串,模式串,字首,字尾,部分匹配值等等概念。教材往往 反著來 先有解決方案和概念,再強行說 啊,就是這樣子的 但我們都應該清楚,概念是輔助思考,輔助解決遇到的問題的。假設我們已經弄懂了暴力匹配解決模式匹配的方法,...

C KMP演算法之next陣列的生成

對於乙個字元來說,如果這個字元向前追溯n個,與從開頭開始向後數n個的字串完全相同,則這個數的next陣列的值為n 1 對於從0開始標號的字元陣列來說,這個數的next陣列的值為n include include using namespace std intmain next 0 1 生成next陣...