隨著越來越多高階語言的出現,字串模式匹配均可以直接呼叫庫函式實現。雖然這些函式用起來很方便,但是我覺得字串匹配的相關演算法,還是需要掌握的,這裡我就參考了網上的一些部落格,算是彌補了我學習資料結構時沒能掌握字串匹配演算法的遺憾,我通過讀部落格還發現了一些更優秀的字串匹配演算法,我特地跟著他人的描述,使用c語言實現了一下,下面就提出來,並寫一寫我的心得。
從頭到尾徹底理解kmp
kmp演算法(1):如何理解kmp
學習關鍵點:
理解真字首
和真字尾
的概念
會求next陣列
在我參考的兩篇部落格裡面有介紹,還很詳細,我就不再寫了,我直接貼出我自己根據演算法介紹寫出來的程式。自己嘗試寫一遍後,發現kmp演算法也不是特別難理解。
#include
#include
// 求next陣列
void
getnext
(char
*pattern,
int length,
int*next)
else
j = next[j];}
}// kmp演算法主體
intkmp
(char
*str,
char
*pattern)
else}if
(j == plen)
return i-j;
else
return-1
;}intmain()
自己實現kmp演算法後,我發現其實kmp演算法在當模式串**現一些重複的字元,特別是真字首和真字尾重複的字元較多時,該演算法能夠有較高的效率;當模式串中沒有重複的字元時,kmp演算法和暴力匹配沒啥區別。
參考過的一篇比較好的部落格,sunday 演算法
在前面的兩篇部落格中,除了介紹kmp演算法,也稍微介紹了其他比較優秀的字串匹配演算法,bm演算法和sunday演算法。bm演算法有壞字元
和好字尾
的概念,但是我覺得在**實現上還要總是計算字尾挺麻煩的(個人理解,具體也沒有深究)。看到的sunday演算法到是讓我眼前一亮,sunday演算法中匹配串每次都能移動不少的位置,在效率上明顯就能看出提高,特別是對於模式串較長的情況。
下面是我自己寫的兩種實現sunday演算法的方式,基本思路是一樣的,我覺得第二種更好一點。
#include
#include
// sunday演算法
intfind
(char
*str,
int n,
char c)
return-1
;}intsunday
(char
*str,
char
*p)else
else
break
; i +
= m;
j =0;
}}if(j == n)
return i-j;
else
return-1
;}intmain()
sunday演算法實現:
#include
#include
// 設定next陣列,因為預設匹配串和模式串都是ascii字元,所以開闢了乙個大小為256的next陣列,
// 設定next陣列相當於以空間換時間,避免每次查詢某個字元在模式串中的位置時的重複比較。
const
int maxsize=
256;
void
getnext
(const
char
*str,
int n,
int*next)
for(
int i=
0;i// 若找到,返回模式串在匹配串中第一次出現位置的下標。
intsunday
(const
char
*str,
const
char
*pattern)
else
else
break;}
}if(k == p_len)
return i;
else
return-1
;}intmain()
字串匹配演算法 字串匹配演算法總覽
字串匹配在文字處理裡非常重要,我們採用簡潔的python 把以下演算法一一實現並講解。樸素演算法 algorithm rabin karp 演算法 有限自動機演算法 finite automation knuth morris pratt 演算法 kmp algorithm boyer moore ...
字串匹配演算法
首先引用一下另一篇文章中對字串匹配的介紹 字串匹配指的是從文字中找出給定字串 稱為模式 的乙個或所有出現的位置。本文的演算法一律輸出全部的匹配位 置。模式串在 中用x m 來表示,文字用y n 來,而所有字串都構造自乙個有限集的字母表 其大小為 根 據先給出模式還是先給出文字,字串匹配分為兩類方法 ...
字串匹配演算法
平常操作文字的時候,經常需要操作對字串進行操作。而字串中最重要的一種操作就叫匹配,字串的匹配演算法很多,人們最熟悉的莫過於kmp演算法了。今天就來談一談一些字串匹配演算法。先來說說大名鼎鼎的kmp演算法,這個演算法出現在無數的資料結構與演算法書上面。它的策略很簡單 當模式串第k個字元不匹配主串中第s...