BM

字符串匹配算法之"Boyer Moore"

柔情痞子 提交于 2019-12-09 23:49:23
Boyer-Moore字符串搜索算法是一种非常高效的字符串搜索算法。它由Bob Boyer和J Strother Moore设计于1977年,最初的定义1975年就给出了,后续才给出构造算法以及算法证明。 先假定部分定义: 1、pattern 为模式字符串,长度为patLen; 2、Text为目标查找字符串,长度为n; 2、当前不匹配字符在pattern中位置为 j(0≤ j ≤patLen -1); 3、已经匹配的长度为 m(0≤ m <patLen); 4、先假设不匹配字符在pattern中位置为 Δ(*),其中*可以是任何字符; 很多资料里面讲解原理时说的数组位置都是从1开始的,这里为了好理解code,都是从0开始; 首先来看下坏字符规则: 一、坏字符规则( bad character rule ): 让不匹配字符和pattern中最右边出现的该字符对齐匹配,如果没有则全部跳过; >假设1 :遇到不匹配字符,如果该字符在pattern 中不存在,有:(如下图示跳转) 字符指针右移:patLen 长度 后和 pattern 右对齐; Pattern 右移:patLen – m; >假设2 :遇到不匹配字符,如果该字符在pattern 中存在,这里也分两种情况: a>.在pattern最右边出现的该字符在当前不匹配字符左边, 有:(如下图示跳转) 字符指针右移:j–Δ(‘-’)

snort 中的Boyer-Moore

[亡魂溺海] 提交于 2019-12-09 23:24:17
声明 ‍ snort中的字串查找,以下代码出自snort-2.9.6.0。是snort中用于字串匹配的底层接口。 主要是参考了Boyer-Moore算法进行实现的. 关于 Boyer-Moore 的文章可以参考 : http://my.oschina.net/u/572632/blog/283380 本文主要是对该部分代码做一分析总结。 ‍ 代码 /* * bmh.h * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License Version 2 as * published by the Free Software Foundation. You may not use, modify or * distribute this program under any other version of the GNU General * Public License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the

Boyer-Moore实现

孤者浪人 提交于 2019-12-09 22:30:55
#include <iostream> #include <vector> #include <algorithm> #include <set> #include <string> #include <cstring> namespace patternMatch{ using namespace std; class boyerMoore{ public: boyerMoore(void):skip(NULL), shift(NULL), charMax(256){} int bmMake(const string &patternStr){ if( shiftMake(patternStr) < 0 || skipMake(patternStr) < 0) return -1; pattern = patternStr; } ~boyerMoore(void){ bmDesory(); } const int match(const string &target) const{ if(pattern.empty() || !shift || !skip || target.size() > pattern.size()) return -1; int targetLen = target.size(); int patternLen = pattern.size(); int