今天有空,認真的對比了一下經典的字串查詢演算法bm演算法和c庫查詢函式 strstr 的區別,兩者各有優缺點,總結一下:
bm演算法的應用場合:適合海量資料搜尋,比如資料庫,磁碟檔案等,總之是資料量越大,效能越高;
strstr,資料量較少時,比較適合,尤其是在乙個幾千位元組的字串中查詢不同的字串,這時候bm被strstr甩出幾條街,原因就是每次查詢,bm都要建立搜尋模型,而strstr立馬上陣。其次,搜尋字元在總字元裡面出現概率較少,相同率很低的情況下,strstr優勢再次展露,比如在http協議頭部關鍵字,像host、get、post、user-agent、accept等,這些關鍵字一次出現幾次的概率都非常少,此時用strstr較快。
廢話這麼多,上**證明一下吧,同時附加乙個改進過的 bm 演算法**:
#include #include #include #include #define max_char 128 // 鍵盤字元,從32-126,總共95個
#define size 128
#define max(x, y) (x) > (y) ? (x) : (y)
void prebmbc(char *pattern, int m, int bmbc)}
void suffix(char *pattern, int m, int suff)
}} void prebmgs(char *pattern, int m, int bmgs)
// case2
j = 0;
for(i = m - 1; i >= 0; i--)}}
// case1
for(i = 0; i <= m - 2; i++)
// print(bmgs, m, "bmgs");}
const char* bm_strstr(char *pattern, int patternlen, const char *text, int textlen)
else
}//printf("no find.\n");
return null;
}const char* line_strstr(const char* src, int srclen, const char* dst, int dstlen)
} else
}return null;
}const char* sun_strstr(const char *text, int textlen, const char *patt, int pattlen)
for( i=0; i < pattlen; i++ )
//shift['s']=6 步,****f['e']=5 以此類推
BM演算法查詢子字串
兩種模式,三種匹配狀態。兩種模式 文字指標i自左向右移動,模式指標自右向左移動。匹配時由pattern的字串由右向左匹配。三種匹配失敗狀態 1.匹配到乙個不在模式字串中的字元,將文字指標i跳躍pattern.length 1。重新匹配。2.匹配到乙個在模式字串中的字元,將文字指標i跳躍的長度為該字元...
BM演算法 字串匹配演算法
思想 使用啟發式規則,通過每次的失敗的匹配嘗試,演算法都能根據這些資訊來排除盡可能多的無法匹配的位置 為什麼說是每次呢,因為每次的情況可能不一樣,通過資訊來跳過啟發式規則的得到的步數 目的 利用啟發式規則,盡可能多跳過無法匹配的位置,從而達到更高的效率 方法 壞字元規則和好字尾規則,取其中移動步數較...
字串匹配 BM演算法
bm演算法 1 三個shift函式 d1,d2,d3,函式的作用是決定當匹配不成功時視窗的移動位數。1 d1 字尾u在模式串p中的另乙個位置是最右出現位置是j 不包括在模式串尾的出現 文字串的視窗安全移動方法是將視窗移動m j字元,使文字中的u與模式串中最右邊的u的出現位置相對齊。對模式中的每個字尾...