kmp字串模式匹配詳解
kmp字串模式匹配通俗點說就是一種在乙個字串中定位另乙個串的高效演算法。簡單匹配演算法的時間複雜度為
o(m*n);kmp
匹配演算法。可以證明它的時間複雜度為
o(m+n).。
一.簡單匹配演算法
先來看乙個簡單匹配演算法的函式:
int index_bf ( char s [ ], char t [ ], int pos )
if ( t[j] == '/0')
return i;
// 匹配成功
返回下標
else
return -1;
// 串s中
(第pos個字元起
)不存在和串
t相同的子串 }
// index_bf
此演算法的思想是直截了當的:將主串
s中某個位置
i起始的子串和模式串
t相比較。即從
j=0
起比較s[i+j]
與t[j]
,若相等,則在主串
s 中存在以
i 為起始位置匹配成功的可能性,繼續往後比較
( j逐步增
1 ),直至與
t串中最後乙個字元相等為止,否則改從
s串的下乙個字元起重新開始進行下一輪的"匹配
",即將串
t向後滑動一位,即i 增
1,而j 退回至
0,重新開始新一輪的匹配。
例如:在串
s=」abcabcabdabba」
中查詢t=」 abcabd」
(我們可以假設從下標
0開始)
:先是比較
s[0]
和t[0]
是否相等,然後比較
s[1]
和t[1]
是否相等
…我們發現一直比較到
s[5]
和t[5]
才不等。如圖:
當這樣乙個失配發生時,
t下標必須回溯到開始,
s下標回溯的長度與
t相同,然後
s下標增
1,然後再次比較。如圖:
這次立刻發生了失配,
t下標又回溯到開始,
s下標增
1,然後再次比較。如圖:
這次立刻發生了失配,
t下標又回溯到開始,
s下標增
1,然後再次比較。如圖:
又一次發生了失配,所以
t下標又回溯到開始,
s下標增
1,然後再次比較。這次
t中的所有字元都和
s中相應的字元匹配了。函式返回t在
s中的起始下標
3。如圖:
二. kmp匹配演算法
還是相同的例子,在
s=」abcabcabdabba」
中查詢t
=」abcabd」
,如果使用
kmp匹配演算法,當第一次搜尋到
s[5]
和t[5]
不等後,
s下標不是回溯到1,
t下標也不是回溯到開始,而是根據t中
t[5]==』d』
的模式函式值(
next[5]=2
,為什麼?後面講),直接比較
s[5]
和t[2]
是否相等,因為相等,s和
t的下標同時增加
;因為又相等,s和
t的下標又同時增加。。。最終在
s中找到了
t。如圖:
kmp匹配演算法和簡單匹配演算法效率比較,乙個極端的例子是: 在
s=「aaaaaa…aab
「(100個a)
中查詢t=」aaaaaaaaab」,
簡單匹配演算法每次都是比較到
t的結尾,發現字元不同,然後
t的下標回溯到開始,
s的下標也要回溯相同長度後增
1,繼續比較。如果使用
kmp匹配演算法,就不必回溯.
對於一般文稿中串的匹配,簡單匹配演算法的時間複雜度可降為
o (m+n)
,因此在多數的實際應用場合下被應用。
kmp演算法的核心思想是利用已經得到的部分匹配資訊來進行後面的匹配過程。看前面的例子。為什麼
t[5]==』d』
的模式函式值等於2(
next[5]=2
),其實這個2表示
t[5]==』d』
的前面有
2個字元和開始的兩個字元相同,且
t[5]==』d』
不等於開始的兩個字元之後的第三個字元(
t[2]=』c』).
如圖:
也就是說,如果開始的兩個字元之後的第三個字元也為
』d』,
那麼,儘管
t[5]==』d』
的前面有
2個字元和開始的兩個字元相同,
t[5]==』d』
的模式函式值也不為
2,而是為0。
前面我說:在
s=」abcabcabdabba」
中查詢t
=」abcabd」
,如果使用
kmp匹配演算法,當第一次搜尋到
s[5]
和t[5]
不等後,
s下標不是回溯到1,
t下標也不是回溯到開始,而是根據t中
t[5]==』d』
的模式函式值,直接比較
s[5]
和t[2]
是否相等。。。為什麼可以這樣?
剛才我又說:「(
next[5]=2
),其實這個2表示
t[5]==』d』
的前面有
2個字元和開始的兩個字元相�
演算法 KMP演算法
kmp演算法主要解決的問題就是在字串 主串 中的模式 pattern 定位問題。記主串為t,模式串為p,則kmp演算法就是返回p在t 現的具體位置,如果沒有出現則返回 1。如果 i 指標指向的字元和 j 指標指向的字元不一致,那麼把 i 右移1位,j 從0位開始,從新開始匹配 如果 i 指標指向的字...
各類排序演算法的比較 摘抄
按平均時間將排序分為四類 1 平方階 o n2 排序 一般稱為簡單排序,例如直接插入 直接選擇和氣泡排序 2 線性對數階 o nlgn 排序 如快速 堆和歸併排序 3 o n1 階排序 是介於0和1之間的常數,即0 1,如希爾排序 4 線性階 o n 排序 如桶 箱和基數排序。各種排序方法比較 簡單...
KMP演算法詳解 適合初學KMP演算法的朋友
相信很多人 包括自己 初識kmp演算法的時候始終是丈二和尚摸不著頭腦,要麼完全不知所云,要麼看不懂書上的解釋,要麼自己覺得好像心裡了解kmp演算法的意思,卻說不出個究竟,所謂知其然不知其所以然是也。經過七八個小時地仔細研究,終於感覺自己能說出其所以然了,又覺得資料結構書上寫得過於簡潔,不易於初學者接...