Wu―Manber算法的改进研究.docVIP

  • 7
  • 0
  • 约8.16千字
  • 约 15页
  • 2017-11-30 发布于湖北
  • 举报
Wu―Manber算法的改进研究   【摘 要】Wu-Manber算法是一种经典的多模式字符串匹配算法,常用于解决网络入侵检测等问题。为了解决Wu-Manber算法在模式集规模增长时,prefix表中会出现过长的模式链表这一问题,通过改变原有prefix表中的链表结构以及存储信息的格式,提出两种改进算法,分别用于处理较小的模式集合和较大的模式集合。实验证实了改进算法可以提高字符串匹配速度,具有很高的实用价值。   【关键词】多模式匹配 Wu-Manber算法 哈希表 二叉树   1 引言   从给定的输入文本T={t1, …, tn}中找出模式集合P={p1, …, pr}的模式在输入文本T中出现的所有位置,称为模式匹配问题[1]。模式匹配的应用非常广泛,包括搜索引擎、数据压缩、拼写检查、网络入侵检测等[2]。模式匹配算法可以分为单模式匹配和多模式匹配。模式匹配算法的类型包括基于字符比较的算法、基于自动机的算法和基于位并行的算法。经典的模式匹配算法有Boyer-Moore算法[3]、Wu-Manber算法[4]、KMP算法[5]、Aho-Corasick算法[6]、Shift-And算法[7]等。   其中Wu-Manber算法是一种基于字符比较的多模式匹配算法,它是单模式匹配算法Boyer-Moore算法在多模式匹配的扩展。在继承Boyer-Moore算法坏字符机制的基础上,将坏字符扩展为坏字符块[8],在实验中性能良好,常用于解决网络入侵检测等问题[9]。   在研究Wu-Manber算法的基础上,本文提出两种改进的Wu-Manber算法:PrefixTreeWM算法和PrefixHashWM算法。改进算法使用改进的PrefixList表,将模式集合通过前缀哈希值和后缀哈希值进行分类,避免冗余操作。通过对前缀哈希值进行排序或者哈希,进一步降低算法的时间复杂度,减少匹配需要的时间。   2 模式匹配问题的一般解决方案   模式匹配问题的一般解决方案包括预处理模式和搜索模式。   预处理模式是将模式集合P中的所有模式进行预处理,并存储到特殊的数据结构中,方便后续的搜索。一般情况下定义最短模式长度m,将模式集合P中的所有模式都截断成长度为m的子串,构造模式集合P。在预处理时只处理其长度为m的子串。比如长度为l的模式串pi={c1, …, cl},lm。首先令pi={c1, …, cm},然后对pi进行预处理。   搜索模式是搜索输入文本T中是否存在模式集合P中的任意模式pi,i=1,…,r,假如模式pi出现在输入文本T中的某一个位置j,则返回j。具体方法是维护一个窗口,窗口的大小与模式集合P中的最短模式长度m相等,首先检查当前窗口的字符串是否可能与模式集合P中的某个模式pi匹配。如果有可能匹配,则将原始模式pi={c1, …, cl}与当前窗口对应的长度为l的字符串进行匹配。   (1)Wu-Manber算法的预处理模式过程需要构建三张表,分别是shift表、hash表和prefix表。shift表是一张跳转表,用于记录指针向右滑动的距离。hash和prefix表是对模式串的后缀及前缀分别做的索引。   构建shift表时,处理模式集合P中所有的模式串,统计他们长度为B的子串(B=2或者B=3),计算子串的shift值,存入shift[h]中,h是子串的哈希值。shift值的定义是字符末位到模式串pi末位的距离,初始化的shift值大小为m-B+1。如果某一个子串出现在多个模式串的不同位置,具有不同的shift值,取最小的shift值。   比如模式集合P={p1=abcde, p2=bcbde, p3=adcabe},最短模式长度m=5,当B的取值为2时,每一个模式的shift值如表1、表2、表3所示,合并后的shift表如表4所示。   prefix表是为所有后缀哈希值为h的模式串构建的一个链表list。它的结构是。hash表的索引值与shift表相同,当某一个子串的后缀哈希值为h时,hash[h]中存储的是指向链表list的指针。如图1所示,模式集合P={…,money,…,honey,…,moley,…,holey,…}。图1中显示出的四个模式串它们的共同后缀为ey,hash[ey]=5309。根据hash表的定义,将指针p存入hash[5309],并使p指向第一个后缀哈希值为5309的模式串的索引114,计算模式串114的前缀哈希值hash[mo]=6323,存储在prefix表中,此节点的指针指向第二个后缀哈希值为5309的模式串287。   (2)Wu-Manber算法的搜索模式时,窗口首先置于输入文本T的开始位置0。对当前窗口对应的m个字符,从右向左读入长度为B的字符块,计算字符块

文档评论(0)

1亿VIP精品文档

相关文档