Wu-Manber算法采用跳跃不可能匹配字符和hash散列的方法,加速匹配的进行。该方法需要对所有模式进行预处理,构建SHIFT,HASH和PREFIX这3个表。SHIFT表同Boyer-Moore算法里的转移表,用来存储字符集中所有块字符在文本中出现时的转移距离;HASH表用来存储匹配窗口内尾块字符散列值相同的模式串;PREFIX表用来存储匹配窗口内首块字符散列值相同的模式串。在对模式串进行匹配的时候就是利用这三个表完成文本的扫描和寻找匹配的过程。

首先介绍预处理过程:

1、计算模式集合P中最短的模式长度m。后续讨论仅考虑每个模式串的前m个字符(那剩余的怎么办呢?o还没想明白),设这些长度为m的模式串组成新集合P’。

2、对P’中每个模式串进行分块,以B个字符为块长度,每次比较长度为B的块。推荐取B=log|Σ|(2*m*k),其中k是模式串的个数,|Σ|是the size of alphabet。

3、构建一个SHIFT表,该表用于在扫描文本串时,根据读入的块决定移动的距离。对于|Σ|大小的字符集,长度为B的块的组合方式有|Σ|^B种可能,因此表的大小为|Σ|^B。

4、将每个长度为B的块用哈希函数计算出一个整数值h,将h为SHIFT表的索引值。

5、穷举P’中所有长度为B的块,对于每个块Bl,计算其相应的SHIFT表值。计算规则如下:找出Bl在P’的每个模式串中出现的最右位置,设这些位置中的最大值为j(以末尾位置为准),则SHIFT[h]=m-j。[注1]

6、其余所有不在P’中的块,SHIFT表值为m-B+1。[注2] [注3]

7、构建HASH表:设HASH[h]=p,p指向两个单独的表:PAT_POINT和PREFIX[注4]。有一个排序过的(根据模式串末B位的哈希值排序)指针链表PAT_POINT,存储着指向所有模式串的指针。p指向PAT_POINT中末B位哈希值为h的第一个节点。

8、构建PREFIX表:将每个模式串前B’位(B’的推荐值为2)的哈希值存入PREFIX表[注5],用于检查前缀是否匹配,可以进一步减少需要朴素匹配的模式串个数。

[注1] 等同于BM算法的“坏字符规则”

[注2] SHIFT表值为m-B+1的原因:这B个字符不出现在P’中,说明最多可能有(B-1)个字符出现在P’中,因此SHIFT表值为m-(B-1)=m-B+1。

[注3] 预处理的5、6步与原文表述的顺序不同,但效果是一样的。原文的做法是先将SHIFT表所有位置初始化为m-B+1,再根据本文的第5步更新SHIFT表值。参见原文第4页第1自然段。

[注4] 此处的表述是按照自己的理解总结得出的,可能不正确。原文第4~5页表述如下:“Let h be the hash value of the current suffix in the text and assume that SHIFT[h] = 0. The value of HASH[h] is a pointer p that points into two separate tables at the same time: We keep a list of pointers to the patterns, PAT_POINT, sorted by the hash values of the last B characters of each pattern. The pointer p points to the beginning of the list of patterns whose hash value is h. To find the end of this list, we keep incrementing this pointer until it is equal to the value in HASH[h+1] (because the whole list is sorted according to the hash values). So, for example, if SHIFT [h] 0, then HASH [h] = HASH [h+1] (because no pattern has a suffix that hash to h). In addition,
we keep a table called PREFIX, which will be described shortly.”

[注5] 预处理过程SHIFT、HASH和PREFIX表的内存位置关系图(根据个人对原文的理解画出,可能不正确):

SHIFT表的构造
不用等到实际考查text时再计算SHIFT,我们预处理各pat就可以把SHIFT表填上。对于每个pat,计算其每个长度为B的subpat(aj-B+1…aj)的值,SHIFT[hashFun(subpat)]=min{m-B+1,m-j}。
HASH表的构造
记现正扫描的text的末B位的哈希值为h。那么HASH[h]的值是p(p指向PAT_POINT中哈希值为h的第一个结点处)。
HASH[]表大小同SHIFT,但相对就稀疏多了,人那儿存着所有可能的组合的SHIFT值。哎,牺牲空间换时间,时空一向两难全。
PREFIX表的构造
对每一个pat,要记录其首B’位字符的哈希值(PREFIX)。
复杂度O(BN/M),B、M含义同前,N是text字符数。Patterns很短或很少的时候,Wu-Manber不是很牛叉。而成千上万的patterns一起匹配过去,Wu-Manber牛气冲天了。

Wu-Manber字符串多模式匹配相关推荐

  1. 字符串的模式匹配 (朴素模式匹配算法 ,KMP算法)

    字符串的模式匹配 寻找字符串p在字符串t中首次出现的起始位置 字符串的顺序存储 typedef struct {char str[MAXSIZE];int length; }seqstring; 朴素 ...

  2. 字符串的模式匹配(Java实现)

    字符串的模式匹配 字串的定位操作通常称做模式匹配,是各种串处理系统中最重要的操作之一.本文主要介绍两种常用的实现算法: 1.暴力匹配 2.KMP算法 1.暴力匹配 时间复杂度为O(n*m):n为主串长 ...

  3. 算法训练二(字符串、模式匹配、堆栈、队列)(含解题思路)(上)

    目录 7-1 好前缀 AC代码: 7-2 好后缀 AC代码: 7-3 [模板]KMP字符串匹配 AC代码: 7-5 接话茬 AC代码: 7-6 串的模式匹配 AC代码: 7-7 词频统计 AC代码: ...

  4. 字符串的模式匹配,KMP算法

    KMP算法是模式匹配的一种改进的算法,所谓的模式匹配也就是对于两个字符串主串S和模式串T.从主串的S的pos个字符起和模式串中的第一个字符进行比较,如果相等,则继续比较后面的字符,否则从主串的下一个字 ...

  5. 字符串的模式匹配--BF算法KMP算法

    BF算法是基于主串指针回溯,重新与子串进行逐字符进行比较,主串为S什么要进行回溯呢,原因在于模式P中存在相同的字符或者说由字符(串)存在重复(模式的部分匹配性质),设想如果模式P中字符各不相同,主串就 ...

  6. Lua字符串及模式匹配

    字符类基础函数举例介绍: string.len( 'string' ) string.lower( 'string' )string.upper( 'string' ) string.rep( 'a' ...

  7. 字符串的模式匹配方法

    String 类型定义了几个用于在字符串中匹配模式的方法.第一个方法就是 match() ,在字符串上调用这个方法,本质上与调用 RegExp 的 exec() 方法相同. match() 方法只接受 ...

  8. 字符串的模式匹配(精准匹配)

    1.朴素的模式匹配算法 2.字符串的特征向量与KMP模式匹配算法 1.朴素的模式匹配直接贴代码 2.1字符串的的特征向量 例如在目标(target)字符串t中:abcabcabcc中 寻找模式(pat ...

  9. 字符串多模式匹配:AC算法

    早在1975年贝尔实验室的两位研究人员Alfred V. Aho 和Margaret J. Corasick就提出了以他们的名字命名的高效的匹配算法-AC算法.该算法几乎与<KMP算法>同 ...

  10. 字符串的模式匹配(KMP)算法

    一.背景 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即串的模式匹配问题. Knuth-Morris-Pratt 算法(简称 KMP)是解决这一问题的常 ...

最新文章

  1. 力扣(LeetCode)刷题,简单+中等题(第26期)
  2. Java 面试,这样拿 Offer!
  3. 初级搭建博客mysql_mysql 初级命令学习2
  4. 用c语言写扫雷游戏倒计时代码,课内资源 - 基于VS2013实现的扫雷小游戏
  5. 智能骨传导眼镜vue_穿戴设备迎新机遇,智能音频眼镜或将是下一个风口
  6. [转]树结构表递归查询在ORACLE和MSSQL中的实现方法
  7. android jni 字符串拼接,JNI 字符串拼接方法
  8. Vue 实现ToDoList
  9. NLG模块实现(未完成)
  10. oracle dba入门线路图--记某培训公司的ORACLE DBA技能进阶实战大纲
  11. preferredsize JAVA_Java JScrollPane.getPreferredSize方法代码示例
  12. VS2005的DEBUG设置
  13. 传google将要退出中国市场
  14. VidMasta:搜索和观看在线电影、电视剧的神器
  15. 吉司机线段树(segment tree beats!)
  16. 因设计或者设施缺陷导致道路交通事故赔偿问题的法律依据
  17. django之 报错(1146, “Table ‘demo2.web‘ doesn‘t exist“)
  18. 齐次式的相关知识【初级中阶辅导】
  19. 邮票的制作(1.主要画笔工具2.钢笔工具)
  20. 中国大学python程序设计答案_Python程序设计1-中国大学mooc-试题题目及答案

热门文章

  1. 进程、线程、协程基本概念理解
  2. NotifyIcon实现托盘程序
  3. css background背景拉伸
  4. 第八章第二层交换和生成树协议(STP)
  5. Memory for crash kernel (0x0 to 0x0) notwithin permissible range
  6. 苹果怎么加辅助功能的计算机,Mac辅助功能 - 基本操作以及设置 - Macbook Pro用户手册...
  7. go插件 vscode 报错_win10环境下配置golang+vscode【解决install failed情况】
  8. 公众号开发 单独 给某个用户 推送消息_校区学生会微信公众平台征稿启事
  9. 无锡linux内核开发,【Linux系统-无锡有前途吗】Softtek2021年Linux系统-无锡就业前景-看准网...
  10. shell 查某个字符串_Shell脚本编程04——Shell编程之sed与awk