字串匹配演算法

2021-09-26 18:30:15 字數 2195 閱讀 1784

隨著越來越多高階語言的出現,字串模式匹配均可以直接呼叫庫函式實現。雖然這些函式用起來很方便,但是我覺得字串匹配的相關演算法,還是需要掌握的,這裡我就參考了網上的一些部落格,算是彌補了我學習資料結構時沒能掌握字串匹配演算法的遺憾,我通過讀部落格還發現了一些更優秀的字串匹配演算法,我特地跟著他人的描述,使用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...