高效的多模式匹配算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
东方企业文化·百家论坛 2011年9月
163
高效的多模式匹配算法
马 力
(重庆青年职业技术学院,重庆,400712)
摘 要:本文提出一种新的多模式匹配算法,以提高匹配检测的执行速度和效率。
该算法采用了基于集合的多模式匹配思想,重新构造了HASH 函数以便在处理大规模模式集时执行时间能比传统的匹配算法的执行时间要少。
经过实验证明,运用该算法不仅具有时间复杂度较低的优点,且与传统算法相比具有更为优越的性能,同时在实际工作状态下的检测能力也更强大。
关键词:多模式匹配 HASH 函数 中图分类号:TP393 文献标识码:A 文章编号:1672—7355(2011)09—0163—01 一、算法描述
通常在自然文本中,经常会发生所谓的坏字符移动。
此时会极大提高Boyer-Moore 算法的检测效率。
但是当文本与多个模式进行匹配时,文本中的多数字符都可能与某些模式的最后一个字符相匹配(即匹配冲突),这时发生坏字符移动的可能性就非常小了。
本文提出的算法解决了如何在上述情况下继续保持Boyer-Moore 算法的实质与效率的问题,采用散列(Hash )技术和高效过滤等方法,减小了匹配冲突对算法执行效率的影响。
算法描述如下:
首先,算法需要计算出模式的最小长度,设其值为m ,为简化算法描述,假定所有模式均具有相同的长度,同时保证最小长度合理以免影响匹配效率。
假设P 为模式的集合,P={P 1P 2……P K },K=|P|,P 中所有模式的长度均为m 。
T 为网络数据包,T=t 1t 2……t n (n ≧m )。
选取Q 为足够大空间的常数,定义长度为m 的支字符串R=r 1r 2……r m ,则构造出R 的Hash 函数:∑=−=m
i i
m i S r Q R Hash 1mod )(,其中S 为上文所提的模式的P
集合。
二、算法流程设计
1. 预处理阶段
首先需要对模式进行排序,形成有序模式链表;然后主要完成三张表(SHIFT 表、HASH 表和PREFIX 表)的创建。
SHIFT 表主要用于确定扫描文本时可移动的字符数。
根据SHIFT 表中的取值分为两种处理情况:SHIFT[i ]≠0:直接根据SHIFT[i ]中的取值,确定移动的字符数。
SHIFT[i ]=0:即前面提到的匹配冲突。
此时需要根据HASH 表和PREFIX 表确定匹配的候选模式并最终核实该模式。
(1)SHIFT 表的创建在此处起到与Boyer-Moore 算法中相同的移动指示作用,只不过移动字符的数目基于长度为B 的字符块。
假设SHIFT 表中包含了每个大小为B 的字符串的入口,那么它的大小为|∑|B 。
为了减少表存储空间,采用了散列函数,将每个长度为B 的字符串映像为一个索引SHIFT 表的整数。
设X=x 1x 2……x b 为文本中的b 个字符串,并假设X 已经被映像为SHIFT 表中的一个入口,则过程SHIFT Table Set Value ()有以下两种情况:
X 不属于substring (P )
:SHIFT[i]=m-B+I ; X 属于substring (P ) :SHIFT[i]=m-q ;
(q 为P i 中X 发生匹配的最右端位置)。
SHIFT 表中的所有初始值均为m-B+1,考虑每个模式
P=P 1P 2……P K ,将每个大小为i
j B j B j P p p p B )(21"+−+−的子
串映像到SHIFT 表中。
通常情况下,SHIFT 表项的取值总是大于0,因此能够成功地跳过文本块并继续扫描文本。
但是当模式数量增多时,情况就完全不同了。
当模式数量增多时,SHIFT 表项取值为0的概率也呈线性递增趋势,即发生匹配冲突的可能性越来越大。
本文设计的该算法的核心思想就是采用散列技术来最小化需要处理模式的数目,避免与模式链表中的每个模式逐一进行匹配,同时结合PREFIX 表的过滤作用,加速搜索过程。
(2)HASH 表的创建创建HASH 表,并使用前面计算出的用于索引SHIFT 表的B 个字符串映像整数作为该表的索引。
设HASH 表的第i 个入口为HASH[i],它包含了一个指向最后B 个字符散列值为i 的模式链表的指针。
链表PAT_POINT 用于存储指向模式的指针,每个模式按其最后B 个字符的散列值大小排序。
设h 为文本当前后缀的散列值,并假设SHIFT[i ]=0,此时HASH[h]的取值指针p 指向散列值为h 的模式链表首部。
为查找链表尾,指针不断递增直至它等于HASH[h+1]。
如果SHIFT[i ]≠0,则有HASH[h]= HASH[h+1],因为不存在后缀散列值为h 的模式。
(3)PREFIX 表的创建多模式中肯定会出现相同后缀的情况,导致HASH 表冲突,即所有具有相同后缀的模式将映像到HASH 表中的同一入口。
为了加快在相同后缀中查找确切匹配模式的速度,算法还引入了用于区分这些模式的一个称为PREFIX 的表。
除了将所有模式的后B 个字符做一映像之外,还须将所有模式的前B 个字符映像到PREFIX 表中。
如果发现SHIFT 值为0,并且要在HASH 表中确定是否存在匹配,那么就在PREFIX 表中检查该值。
对每个后缀而言,HASH 表不仅包含具有所有此后缀的模式,而且还包含了他们相应的前缀。
可以通过左移m-B 个位置计算出文本中的相应前缀,并用它来过滤那些后缀相同但是前缀不同的模式。
2. 扫描阶段
扫描阶段的流程如下:(1)计算tm-B+1到tm 的基于文本当前B 个字符的散列值h ;(2)检查SHIFT[h]的取值,如大于0,移动文本返回(1),否则转至(3);(3)从当前位置向左m 个字符处开始计算文本中的前缀散列值,称为文本前缀;(4)检查每个p ,SHIFT[h]≦p <HASH[h+1],是否有PREFIX[P]=text-prefix 。
如果相等,那么就直接检查与文本相对应的实际模式(由PAT_POINT[p]给出)。
参考文献:
[1] Crosbie , Gene Spafford. Defending a Computer System using Autonomous Agent[R].COAST Technical Report
No.95-022, March
1994. [2] Aho A , Corasick M. Efficient String Matching an
Aid to Bibliographic Search [J]. Communication of the ACM ,
1975, 18(6)
: 333-340.。