在網路安全的研究中,字串匹配是一種使用很普遍的技術,例如防毒軟體和ids中的特徵碼匹配,都需要用到字串匹配。作為字串匹配中的一種特殊情況,近似字串匹配的研究也同樣重要。這裡將對字串匹配演算法進行簡要分析和總結。
一 精確字串匹配
字串的精確匹配演算法中,最著名的有kmp演算法和bm演算法。下面分別對幾種常用的演算法進行描述。
1:kmp演算法
kmp演算法,即knuth-morris-pratt演算法,是一種典型的基於字首的搜尋的字串匹配演算法。kmp演算法的搜尋思路應該算是比較簡單的:模式和檔案進行字首匹配,一旦發現不匹配的現象,則通過乙個精心構造的陣列索引模式向前滑動的距離。這個演算法相對於常規的逐個字元匹配的方法的優越之處在於,它可以通過陣列索引,減少匹配的次數,從而提高執行效率。
詳細演算法介紹參考:kmp演算法詳解(matrix67原創)
2:horspool演算法
和kmp演算法相反,horspool演算法採用的是字尾搜尋方法。horspool演算法可以說是bm演算法的意見簡化版本。在進行字尾匹配的時候,若發現不匹配字元,則需要將模式向右移動。假設文字中對齊模式最後乙個字元的元素是字元c,則horspool演算法根據c的不同情況來確定移動的距離。實際上,horspool演算法也就是通過最大安全移動距離來減少匹配的次數,從而提高執行效率的。
演算法參考:《演算法設計與分析基礎》 第二版 清華大學出版社
3:bm演算法
bm演算法採用的是字尾搜尋(boyer-moore演算法)。bm演算法預先計算出三個函式值d1、d2、d3,它們分別對應三種不同的情形。當進行字尾匹配的時候,如果模式最右邊的字元和文字中相應的字元比較失敗,則演算法和horspool的操作完全一致。當遇到不匹配的字元並非模式最後字元時,則演算法有所不同。
演算法參考:《演算法設計與分析基礎》 第二版 清華大學出版社
4:shift-and演算法
這種演算法比kmp簡單,不過它的特點在於運用了位並行技術,提高程式執行效率。shift-and演算法首先構造乙個表,記錄字母表中每個字元的位掩碼。然後每讀取乙個文字字元的時候,通過計算公式的運算,獲取新的位向量。
二 近似字串匹配
近似字串匹配主要有四種方法。第一種是動態規劃方法,這是最古老,同時也是最靈活的近似匹配演算法。第二種是基於自動機公式模擬文字搜尋。第三種方式採用位並行方法來模擬其他方法,號稱是「最成功」的一種方法。最後則是通過簡單的過濾文字中不相關文字時間快速搜尋。
1:動態規劃演算法
動態規劃演算法是基於「編輯距離」的概念實現近似字串匹配。通俗地說,編輯距離表示將乙個字串變換成另乙個字串所需要進行的最少的編輯次數。這裡的編輯操作包括新增、刪除、替換。通過計算編輯距離矩陣,可以得出最佳匹配。
編輯矩陣的初始化和計算是動態規劃演算法的關鍵。初始化數值直接決定是全域性匹配還是區域性匹配,而在計算公式中所採用的增量,則表示了各種操作的權值。
上面公式中,這三種編輯操作的權值都為1,但是實際上可以修改權值以限制各種編輯操作出現的頻率。例如,在pi專案中,就採用了不同的權值進行計算。詳細描述參考」network protocol analysis using bioinformatics algorithms」。
演算法描述中提到,為了減少空間複雜度,沒有必要儲存整個編輯矩陣。但是,貌似如果不儲存整個編輯矩陣的話,就很難通過回溯的方法找到最優匹配。
上面這個狀態轉換圖讓人感覺莫名其妙,不知道這個自動機是如何轉換的。實際上,這是通過公式計算出來的。
3:位並行演算法
實際上,與其說位並行演算法是一種近似搜尋方法,倒不如說它是一種加速實現的手段。位並行演算法是用來模擬經典演算法的。在搜尋中,通過並行模擬,可以加快經典演算法的執行速度。位並行演算法非常適合模式串比較短的情況。
位並行實際上利用了計算機的並行性原理,將若干不同的值打包到乙個長度為w的計算機字中,這樣就可以利用一次操作或運算來實現原本需要若干次操作或運算才能完成的功能。
參考:《用位並行法進行過濾的中文近似串匹配演算法》
4:文字快速過濾演算法
過濾演算法是基於這種思想:判斷文中某個位置的字串和模式串不匹配,可能比判斷而這相匹配更容易。所以過濾演算法的思路為:通過過濾演算法過濾文字中不能產生成功匹配的區域,然後結合非過濾文字搜尋演算法,最終實現快速字串匹配。當錯誤水平比較低時,文字過濾演算法的執行效果很好,否則就很差。
過濾演算法比較多,當字母表不是太小的時候,pex方法執行效果最好。當字母表很小的時候,abndm演算法比較好。
5 總結
以上討論了四種近似字串匹配方法的主要思路。實際上,我們可以看到,字串匹配方法的關鍵計算編輯距離。動態規劃直接計算編輯距離矩陣,而自動機方法則以另一種方式表示了文字輸入後的編輯距離向量。位並行演算法主要是利用計算機的並行性,模擬經典近似匹配演算法,加快運算速度。文字過濾演算法則通過過濾不可能成功匹配的文字,然後結合經典近似匹配演算法實現快速字串匹配。
字串匹配演算法 字串匹配演算法總覽
字串匹配在文字處理裡非常重要,我們採用簡潔的python 把以下演算法一一實現並講解。樸素演算法 algorithm rabin karp 演算法 有限自動機演算法 finite automation knuth morris pratt 演算法 kmp algorithm boyer moore ...
字串匹配演算法
首先引用一下另一篇文章中對字串匹配的介紹 字串匹配指的是從文字中找出給定字串 稱為模式 的乙個或所有出現的位置。本文的演算法一律輸出全部的匹配位 置。模式串在 中用x m 來表示,文字用y n 來,而所有字串都構造自乙個有限集的字母表 其大小為 根 據先給出模式還是先給出文字,字串匹配分為兩類方法 ...
字串匹配演算法
平常操作文字的時候,經常需要操作對字串進行操作。而字串中最重要的一種操作就叫匹配,字串的匹配演算法很多,人們最熟悉的莫過於kmp演算法了。今天就來談一談一些字串匹配演算法。先來說說大名鼎鼎的kmp演算法,這個演算法出現在無數的資料結構與演算法書上面。它的策略很簡單 當模式串第k個字元不匹配主串中第s...