字串搜尋演算法

2021-04-21 00:17:13 字數 1252 閱讀 4436

參考文獻: google: boyer moore

1. 前言

字串搜尋是乙個基本的操作,c庫函式中也提供了strstr()函式進行字串搜尋,應該是屬於線性搜尋。此外,為提高搜尋速度,人們又發展 出一些快速搜尋演算法,如boyer-moore演算法等,其與線性搜尋的區別是當發現模式不匹配時,不是象線性搜尋那樣只移動乙個位元組,而是盡可能多地移動 多個位元組長度,以提高搜尋速度。

2. 線性搜尋

下面是我自己寫的乙個線性搜尋演算法的例子,比較簡單,就不用說明了,text是資料,pattern是要搜尋的模式。

unsigned char * linear_strstr(const unsigned char *text, const unsigned char *pattern)

return null; }

3. 快速搜尋

下面是類似bm演算法的乙個實現,此類快速搜尋都需要建立乙個步長索引表,因為資料以位元組為單位,每個位元組為0~255的數,因此索引表長度為 256,在表中記錄要每個位元組(0~255)的移動步長,各種快速搜尋演算法要確定的就是這個索引表的值,然後在匹配不成功時確定取索引表中哪個值。

對於bm演算法,索引表中的值取該值在搜尋模式中相對於結尾符'0'的位置,如果該值不在搜尋模式中,取搜尋模式長度加1。對每次匹配操作,資料 被匹配模式分成三部分,資料左部,已經匹配檢查過的部分;資料中部,正在匹配部分,長度等於模式長度;資料右部,還沒有與模式進行匹配的部分。當匹配失敗 時,移動步長取資料右部第乙個字元對應的步長值,以下是**實現:

int shift[256];

void pre_proecss(const unsigned char *pattern)

return null; }

如果可能預先取得資料長度的話,盡量將資料長度作為引數傳遞到搜尋函式而不是在函式中再計算資料長度,這樣有助於提高搜尋速度。

4. 結論

快速搜尋和線性搜尋比起來每次移動的步長可以比較多,但需要付出不少代價:第一,資料長度是必須知道的,防止移動過界,計算資料長度需要花費不 少時間;第二,需要乙個索引表進行計算,如果在核心實現時得考慮多cpu處理的問題(這在linux核心netfilter的字串匹配**中有體現)。 在實際測試中,如果模式字串長度比較小,資料長度未知時,快速搜尋演算法速度實際比線性搜尋還慢。快速搜尋只適用於資料長度已知,匹配模式也比較長的場 合。

**稍加修改就可以處理大小寫無關的字串查詢。

字串搜尋演算法總結

因為在網上搜尋hash演算法的知識,無意中又找到一些字串搜尋演算法。由於之前已經學習過一些搜尋演算法,覺得應該可以歸為一類。因此就寫一篇文章來記錄下學習的過程。問題 在一長字串中找出其是否包含某子字串。首先當然還是簡單演算法,通過遍歷來檢索所有的可能 public static int search...

字串匹配 暴力搜尋演算法

主要特徵 1 沒有預處理階段 2 需要常量額外空間 3 通常需要模式串視窗向右移動乙個位置 4 可以按照任意順序進行比較 5 搜尋的時間複雜度為 o mn 6 文字字元期望比較次數 2n演算法描述 暴力搜尋演算法由文字串中從0到 n m所有位置的比較組成,無論是否從模式串的起始位置開始,每次匹配過後...

字串匹配 暴力搜尋演算法

1 沒有預處理階段 2 需要常量額外空間 3 通常需要模式串視窗向右移動乙個位置 4 可以按照任意順序進行比較 5 搜尋的時間複雜度為o mn 6 文字字元期望比較次數 2n 暴力搜尋演算法由文字串中從0到n m所有位置的比較組成,無論是否從模式串的起始位置開始,每次匹配過後,模式串向右移動一位。暴...