注:本文大致翻譯自
exact string matching algorithms,去掉一些廢話,增加一些解釋。
文字資訊可以說是迄今為止最主要的一種資訊交換手段,而作為文字處理中的乙個重要領域——字串匹配,就是我們今天要說的話題。(
字串匹配指的是從文字中找出給定字串(稱為模式)的乙個或所有出現的位置。本文的演算法一律輸出全部的匹配位置。模式串在**中用x[m]來表示,文字用y[n]來,而所有字串都構造自乙個有限集的字母表σ,其大小為σ。
根據先給出模式還是先給出文字,字串匹配分為兩類方法:
本文僅討論第一類方法。
文中的匹配演算法都是基於這樣一種方式來進行的:設想乙個長度為m的視窗,首先視窗的左端和文字的左端對齊,把視窗中的字元與模式字元進行比較,這稱為一趟比較,當這一趟比較完全匹配或者出現失配時,將視窗向右移動。重複這個過程,直到視窗的右端到達了文字的右端。這種方法我們通常叫sliding window。
對於窮舉法來說,找到所有匹配位置需要的時間為o(mn),基於對窮舉法改進的結果,我們按照每一趟比較時的比較順序,把這些演算法分為以下四種:
從右到左:通常在實踐中能產生最好的演算法
特殊順序:可以達到理論上的極限
任意順序:這些演算法跟比較順序沒關係(例如:窮舉法)
一些主要演算法的簡單介紹如下:
採用雜湊,可以很容易在大部分情況下避免二次比較,通過合理的假設,這種演算法是線性時間複雜度的。它最先由harrison提出,而後由karp和rabin全面分析,稱為kr演算法。
在假設模式長度不大於機器字長時,shift-or演算法是很高效的匹配演算法,同時它可以很容易擴充套件到模糊匹配上。
mp是第乙個線性時間演算法,隨後被改進為kmp,它的匹配方式很類似於自動機的識別過程,文字的每個字元與模式的每個字元比較不會超過log
基於確定性有限自動機的演算法對文字字元剛好只用n次訪問,但是它需要額外的
一種叫forward dawg matching的演算法同樣也只用n次訪問,它使用了模式的字尾自動機。
apostolico-crochemore演算法是一種簡單演算法,最壞情況下也只需要3n/2次比較。
還有一種不那麼幼稚(not so *****)的演算法,最壞情況下是n平方,但是預處理過程的時間和空間均為常數,而且平均情況下的效能非常接近線性。
bm演算法被認為是通常應用中最有效率的演算法了,它或者它的簡化版本常用於文字編輯器中的搜尋和替換功能,對於非週期性的模式而言,3n是這種演算法的比較次數上界了,不過對於週期性模式,它最壞情況下需要n的二次方。
bm演算法的一些變種避免了原演算法的二次方問題,比較高效的有:apostolico and giancarlo演算法、turbo bm演算法和reverse colussi演算法。
實驗的結果表明,quick search演算法(bm的乙個變種)以及基於字尾自動機的reverse factor和turbo reverse factor演算法算是實踐中最有效的演算法了。
zhu and takaoka演算法和br演算法也是bm的變種,它們則需要
最先達到空間線性最優的是galil-seiferas和two way演算法,它們把模式分為兩部分,先從左到右搜尋右邊的部分,如果沒有失配,再搜尋左邊的部分。
colussi和galil-giancarlo演算法將模式位置分為兩個子集,先從左至右搜尋第乙個子集,如果沒有失配,再搜尋剩下的。colussi演算法作為kmp演算法的改進,使得最壞情況下只需要3n/2次比較,而galil-giancarlo演算法則通過改進colussi演算法的乙個特殊情況,把最壞比較次數減少到了4n/3。
最佳失配和m最大位移演算法分別根據模式的字元頻率和首字位移,對模式位置進行排序。
skip search,kmp skip search和alpha skip search演算法運用「桶」的方法來決定模式的起始位置。
在接下來的章節中,我們會給出上面這些演算法的實現。我們把字母表限定為ascii碼或者它的任意子集,程式語言用c,這就意味著陣列索引是從0開始,而字串以null結尾。
(
字串匹配演算法 字串匹配演算法總覽
字串匹配在文字處理裡非常重要,我們採用簡潔的python 把以下演算法一一實現並講解。樸素演算法 algorithm rabin karp 演算法 有限自動機演算法 finite automation knuth morris pratt 演算法 kmp algorithm boyer moore ...
字串匹配演算法
首先引用一下另一篇文章中對字串匹配的介紹 字串匹配指的是從文字中找出給定字串 稱為模式 的乙個或所有出現的位置。本文的演算法一律輸出全部的匹配位 置。模式串在 中用x m 來表示,文字用y n 來,而所有字串都構造自乙個有限集的字母表 其大小為 根 據先給出模式還是先給出文字,字串匹配分為兩類方法 ...
字串匹配演算法
平常操作文字的時候,經常需要操作對字串進行操作。而字串中最重要的一種操作就叫匹配,字串的匹配演算法很多,人們最熟悉的莫過於kmp演算法了。今天就來談一談一些字串匹配演算法。先來說說大名鼎鼎的kmp演算法,這個演算法出現在無數的資料結構與演算法書上面。它的策略很簡單 當模式串第k個字元不匹配主串中第s...