KPM BM AC ACBM演算法分析

2021-07-11 15:56:32 字數 2226 閱讀 2456

最近在定位dpi應用識別的問題,總是發現在特徵數量達到一定規模的時候,特徵匹配不出來;所以又得投身於分析有點難搞的acbm演算法了。不過最終確定該問題並不是匹配部分問題,而是初始化編譯狀態機的問題。

在分析kpm演算法之前,先看一下我們最容易想到的查詢辦法。

首先,字串」bbc abcdab abcdabcdabde」的第乙個字元與搜尋詞」abcdabd」的第乙個字元,進行比較。因為b與a不匹配,所以搜尋詞後移一位。

因為b與a不匹配,搜尋詞再往後移這裡寫描述

就這樣,直到字串有乙個字元,與搜尋詞的第乙個字元相同為止

接著比較字串和搜尋詞的下乙個字元,還是相同。

直到字串有乙個字元,與搜尋詞對應的字元不相同為止。

這時,最自然的反應是,將搜尋詞整個後移一位,再從頭逐個比較。這樣做雖然可行,但是效率很差,因為你要把」搜尋位置」移到已經比較過的位置,重比一遍。

怎麼做到這一點呢?可以針對搜尋詞,算出一張《部分匹配表》(partial match table)。這張表是如何產生的,後面再介紹,這裡只要會用就可以了。後面會詳細分析部分匹配值的計算方法。

已知空格與d不匹配時,前面六個字元」abcdab」是匹配的。查表可知,最後乙個匹配字元b對應的」部分匹配值」為2,因此按照下面的公式算出向後移動的位數:

移動位數 = 已匹配的字元數 - 對應的部分匹配值

因為 6 - 2 等於4,所以將搜尋詞向後移動4位。移動4位後結果如下圖

因為空格與a不匹配,繼續後移一位

逐位比較,直到發現c與d不匹配。於是,移動位數 = 6 - 2,繼續將搜尋詞向後移動4位

部分匹配值表計算方法

「部分匹配值」就是」字首」和」字尾」的最長的共有元素的長度。以」abcdabd」為例,

- 「a」的字首和字尾都為空集,共有元素的長度為0;

- 「ab」的字首為[a],字尾為[b],共有元素的長度為0;

- 「abc」的字首為[a, ab],字尾為[bc, c],共有元素的長度0;

- 「abcd」的字首為[a, ab, abc],字尾為[bcd, cd, d],共有元素的長度為0;

- 「abcda」的字首為[a, ab, abc, abcd],字尾為[bcda, cda, da, a],共有元素為」a」,長度為1;

- 「abcdab」的字首為[a, ab, abc, abcd, abcda],字尾為[bcdab, cdab, dab, ab, b],共有元素為」ab」,長度為2;

- 「abcdabd」的字首為[a, ab, abc, abcd, abcda, abcdab],字尾為[bcdabd, cdabd, dabd, abd, bd, d],共有元素的長度為0。

計算特徵串next值得c語言**

void getnext(const

char *p,int next)//多算一位的next演算法

else j=next[j];}}

待續,bm、acbm演算法下次繼續

演算法分析 演算法的漸進效率分析

一般用於界定函式集合的上界,漸進表示式o g n 的含義就是,c為正常數,函式集合o中的元素的最大值不會超過c.g n f n o g n 的含義是,函式f n 的屬於集合o g n 因為函式集合o中的最大值為c.g n 所以f n 的最大值為c.g n 由於只是漸進的上界,所以當函式g n 的階數...

演算法和演算法分析

一 演算法的基本概述 演算法是為了解決某類問題而規定的乙個有限長的操作序列。乙個演算法必須滿足以下五個重要特性 1 有窮性2 確定性3 可行性 4 有輸入5 有輸出 二 設計演算法的原則 1.正確性 2.可讀性 3 健壯性 4.高效率與低儲存量需求 三 演算法的時間複雜度簡介 語句頻度 語句重複執行...

演算法和演算法分析

演算法是為了解決某類問題而規定的乙個有限長的操作序列。五個特性 1.有窮性2.確定性3.可行性4.輸入5.輸出 1.正確性2.可讀性3.健壯性4.高效性 1.問題規模和語句頻度 不考慮計算機的軟硬體等環境因素,影響演算法時間代價的最主要因素是問題規模。問題規模是演算法求解問題輸入量的多少,是問題大小...