字串匹配演算法

2021-06-08 20:45:59 字數 1261 閱讀 8596

平常操作文字的時候,經常需要操作對字串進行操作。而字串中最重要的一種操作就叫匹配,字串的匹配演算法很多,人們最熟悉的莫過於kmp演算法了。今天就來談一談一些字串匹配演算法。

先來說說大名鼎鼎的kmp演算法,這個演算法出現在無數的資料結構與演算法書上面。它的策略很簡單:當模式串第k個字元不匹配主串中第s時,我們其實己經知道了主串中s個字元前的k-1個字元是什麼,於是利用這些資訊,構造乙個前k-1個字元的最長的字首和字尾相同的乙個位置,再從這個位置的下乙個字元進行匹配。這也是我們經常求的next陣列,對於next陣列還有乙個優化,那就是最長的串的後乙個字元與第k個字元相同時,我們可以知道,那麼下一次匹配肯定也不會成功,因為先前那一次我們己經知道這個位置的字元不是第s個字元了。這也就是經常說了nextval陣列。它是在模式串中求得的,這裡就不細說了,相信各位都己經很清楚,有興趣的可以上網查查相關資料。

但實際用到的呢?對於很多簡單的查詢程式來說,並沒有使用kmp演算法,而是使用的蠻力(brute-force)匹配,也就是傳說中的暴力了。雖然kmp演算法比蠻力匹配演算法複雜度在大o標記下要高很多,但是一般來說差別並不大,所以現在許多簡單的查詢程式還是使用的蠻力,因為它實現起來非常簡單。

而受蠻力匹配演算法的影響,又出現了一種叫bm的演算法,它的模式在從右到左進行匹配的,與平常我們從左到右乙個乙個進行匹配又有點不相同。它比暴力演算法又好在哪呢?因為在暴力的時候我們發現不匹配的時候是乙個乙個字元右移的,而bm演算法不是,它通過不匹配位置的字元是否出現在模式串在來進行,比如主串乙個字元c,與字元的某個位置進行比較發現不匹配,並且c不曾出現過在模式串中,那麼在這之前的所有字元都不會匹配的,所以模式串肯定需要移動c前面的字元個數個位置!而不匹配時又出現在模式串中了呢?我們右移最右出現的位置的個數個,雖然不一定是最好的,但是能保證一定不會漏掉任何可能的匹配。

還有一種多模式的匹配演算法叫做ac自動機。它能一次匹配多個模式串。它與kmp的思路很像,不匹配時找乙個最長的再繼續進行!它需要先把字串建成一顆trie樹,樹結點有乙個叫做failed的指標,是表示如果不匹配時應該再從哪個結點進行匹配。因為這種做法是一種dfa上的匹配,而發明這種演算法的人叫a.c.,所以就叫ac自動機了。複雜度很好,比每個模式串用一次kmp演算法要好很多。

還有一種叫做字尾陣列和字尾樹的,字尾樹是可以**為字尾陣列的,這兩種構造起來很不簡單,但是複雜度卻是驚人的好。如求最長重複連續子串,出現次數最多的子串等都能用它完美的解決。有興趣的可以搜搜,字尾陣列的資料應該是比較多的,而字尾樹由於太複雜,資料不是很多,還是有的。

上面介紹的都是精確匹配的演算法,其實對於字串,還有一種模糊匹配,有興趣的讀者可以閱讀一本叫做《柔性字串匹配》的書,肯定會讓你獲益匪淺。

字串匹配演算法 字串匹配演算法總覽

字串匹配在文字處理裡非常重要,我們採用簡潔的python 把以下演算法一一實現並講解。樸素演算法 algorithm rabin karp 演算法 有限自動機演算法 finite automation knuth morris pratt 演算法 kmp algorithm boyer moore ...

字串匹配演算法

首先引用一下另一篇文章中對字串匹配的介紹 字串匹配指的是從文字中找出給定字串 稱為模式 的乙個或所有出現的位置。本文的演算法一律輸出全部的匹配位 置。模式串在 中用x m 來表示,文字用y n 來,而所有字串都構造自乙個有限集的字母表 其大小為 根 據先給出模式還是先給出文字,字串匹配分為兩類方法 ...

字串匹配演算法

一 bf演算法 bf演算法是普通的模式匹配演算法,其基本思想就是將目標串的第乙個字元與模式串的第乙個字元進行匹配。若相等,則繼續比較第二個字元 若不相等,則比較目標串的第二個字元和模式串的第乙個字元。依次比較下去,直到得出最後的匹配結果。示例 static int bf const char src...