模式匹配之路

2021-06-05 11:55:33 字數 1701 閱讀 7683

之前我的文章中,介紹了kmp,bm,ac,wm等幾個經典的模式匹配演算法,本文我將對常用的模式匹配演算法做一小結。

模式匹配演算法的關係圖如下所示:

這裡有幾個我的文章中暫時沒有涵蓋的演算法,這裡做一簡要說明。

rabin-karp演算法,這是乙個基於雜湊值的模式匹配演算法,根據雜湊演算法,將長度為m的模式串計算乙個雜湊值,然後對於目標串中各長度為m的子串分別計算雜湊值,與模式串的雜湊結果相比較,只有雜湊值相同的,才會再執行與模式串的逐一字元比較。這個演算法的適應性很強,如果選擇比較優秀的雜湊演算法,可以在近似o(n)的時間複雜度內完成匹配操作。但是美中不足的是,雖然雜湊計算的運算開銷不是很大,但是對於字串匹配這種每秒鐘可能需要執行數萬次的基本運算來說,雜湊計算可能就是比較大的負擔了,其在實際應用中使用的不多,但是雜湊思想也是解決模式匹配的重要手段,wm演算法就受到了該演算法的啟發。

自動機演算法,我在《kmp演算法詳解》一文中,略微提到了一下,實際上kmp演算法構造的next表,就乙個簡化的和輸入字元集合不相關的自動機。自動機是解決模式匹配問題最經典,也最為有效的方法。kmp,bm,ac演算法無一沒有它的影子,但是自動機也有無法克服的缺點,就是構造模式串所對應的自動機的成本較高。在一般的單模式匹配場景中,構造模式串自動機的開銷,很可能比用樸素的模式匹配演算法執行一次對目標串的匹配還要高,這使得自動機演算法的實用價值大大下降,不過正因為此,才促使人們去研究如何以較低的成本計算模式串的自動機,或者說叫做狀態轉移表,從而催生出像kmp這樣的精妙演算法的誕生。

boyer-moore-horspool演算法,是bm演算法的乙個簡化版本,由於bm演算法中的好字尾表計算成本不低,horspool於2023年提出這個bm簡化演算法,拋棄了好字尾表跳轉,只使用壞字元跳轉規則.在最好情況下,也可以獲得o(m/n)的時間複雜度(m是目標串長度,n是模式串長度),但是對於某些壞情況,時間複雜度仍可能為o(mn)。

這些演算法共同構成了模式匹配的發展脈絡,在實際應用中,更多的情況下並不是使用這其中的某乙個典型演算法,而是將多個演算法的思想結合起來,進一步優化模式匹配的效率。以wm演算法為例,其本身就借鑑了bm演算法和rk演算法的核心思想,如果在發現shift為0的一組備選模式集合之後,再使用ac演算法的自動機來執行對備選模式集合的匹配操作,則相較於wm兩人**中所用的逐一匹配方法,效率還會有提高。同樣,對於ac演算法,如果使用wm演算法中的壞字元塊跳轉,將目標串中,模式集合不存在的字串行跳過,也會大幅提公升效率。總結起來,解決模式匹配無外乎壞字元,自動機,雜湊三種基本工具而已,只要這三種工具讀者爛熟於胸,對於任何的模式匹配問題,解決方案只是信手拈來而已。

這些演算法,都是前人的智慧型結晶,對於我們來說,更多的時候是拿來主義,用用而已,但是對於那種並非課後作業題的應用場合,我們還是有必要去深刻了解他們的具體細節。沒有對這些演算法的深刻理解,我們就不會了解哪個演算法用在那個場景更合適,如何僅作小小的修改就能解決效能問題。就單模式匹配而言,kmp作為最穩定的匹配演算法當仁不讓,但是對於絕大多數情況,樸素的模式匹配演算法就足夠了,特別是對於像中文這樣字首自包含很不常見的象形文本。而如果要追求絕對速度,則bm演算法才是真正的王道,但是你需要考慮如何優化好字尾的計算開銷。如果覺得好字尾的計算搞不定,又想有不錯的速度表現,那麼bmh演算法也是可以參考的利器。在多模式應用場景,如果你對要處理的模式集合一無所知,那麼你很難將wm應用於這樣的場合,個別的畸形模式可能會讓演算法的效率大打折扣,還是乖乖的使用ac演算法,但是實際上你也輕鬆不到**去,如何權衡ac演算法的自動機開銷,將是你無法迴避的問題。而對於更多的情況,特別是中文詞條處理,wm演算法還是可以找到更廣闊的應用天地的,只要你的手頭有乙個足夠好用的字典庫。所以更多的時候演算法的應用沒有最優只有權衡。

shell之匹配模式和擴充套件匹配模式

首先說一下什麼是匹配模式,然後再介紹擴充套件匹配模式。匹配模式這個概念就算不知道,但是也都會使用這個功能找到匹配的檔案。例如 ls ab 找到所有以ab開頭的檔案。這就是利用了 可以匹配任意字串,包括空串。匹配模式是man bash中的pattern matching,星號的含義在上面講了。用來匹配...

perl 模式匹配

一 簡介 模式指在字串中尋找的特定序列的字元,由反斜線包含 def 即模式def。其用法如結合函式split將字串用某模式分成多個單詞 array split line 二 匹配操作符 檢驗匹配是否成功 result var abc 若在該字串中找到了該模式,則返回非零值,即true,不匹配則返回0...

模式匹配。。。openCV

參考http www.cnblogs.com xrwang archive 2010 02 05 matchtemplate.html 和 learning opencv 模板匹配的工作方式 模板匹配的工作方式跟直方圖的反向投影基本一樣,大致過程是這樣的 通過在輸入影象上滑 像塊對實際的影象塊和輸入...