ACBM算法
2016-03-19 14:10
1911 查看
ACBM算法:
ACBM算法是在AC自动机的基础之上,引入了BM算法的多模扩展,实现的高效的多模匹配。和AC自动机不同的是,ACBM算法不需要扫描目标文本串中的每一个字符,可以利用本次匹配不成功的信息,跳过尽可能多的字符,实现高效匹配。
比如:{P} = {her,where,redo},匹配过程如下:
可以看到在匹配步骤如下:
1、 选定一个匹配起始位置。
2、 使用AC树进行匹配,如果匹配失效,跳转步骤1;如果匹配成功,可根据应用需要跳转至步骤1或者退出。
ACBM算法的核心思想就是让每次匹配的起始位置跨度尽可能的大,以提高效率。
上例中,采用的是整体上正向匹配+反向的AC自动机;可以采用整体上反向的匹配+正向的AC自动机。
ACBM算法中的AC算法部分比AC自动机算法的实现要简单,不需要考虑失效函数的问题,也就是说ACBM算法中实现的AC算法部分是一棵树,而在AC自动机的实现是一个图。
ACBM算法中的BM算法的实现要比BM算法本身的实现要复杂一些,因为这是对BM算法的多模式一种扩展。
ACBM算法中的核心数据结构:
1、 MinLen,模式串集合中最短那个模式串的长度:比较失配时最多跳跃的字符个数不能超过Minlen。
2、 ACTree,由模式串集合构建出的状态树,构建方法和AC自动机的构建方法相同,而且不需要计算失效函数,比较简单。
3、 BCshift[256]:ACTree对应一个坏字符数组,当匹配失效时,查找该数组计算坏字符偏移量。
4、 GSshift:AC树的每一个节点对应一个好后缀偏移量。
ACBM算法的核心部分是计算BCshift和GSshift,可参考BM算法的实现。
自然而然的我们会想到结合AC算法和BM技术,因为在AC算法中,字符串是从左到右匹配的,如果字符串中和pattern很少的情况下ACBM算法大大的提高性能。
说了这么多,其实ACBM根本就不需要知道那么多,只需要为ACBM添加一个bad-character 的match:就是说,如果文本中当前字符上不匹配(假设为b),模式串跳到最后一个出现b的位置
ACBM算法是在AC自动机的基础之上,引入了BM算法的多模扩展,实现的高效的多模匹配。和AC自动机不同的是,ACBM算法不需要扫描目标文本串中的每一个字符,可以利用本次匹配不成功的信息,跳过尽可能多的字符,实现高效匹配。
比如:{P} = {her,where,redo},匹配过程如下:
可以看到在匹配步骤如下:
1、 选定一个匹配起始位置。
2、 使用AC树进行匹配,如果匹配失效,跳转步骤1;如果匹配成功,可根据应用需要跳转至步骤1或者退出。
ACBM算法的核心思想就是让每次匹配的起始位置跨度尽可能的大,以提高效率。
上例中,采用的是整体上正向匹配+反向的AC自动机;可以采用整体上反向的匹配+正向的AC自动机。
ACBM算法中的AC算法部分比AC自动机算法的实现要简单,不需要考虑失效函数的问题,也就是说ACBM算法中实现的AC算法部分是一棵树,而在AC自动机的实现是一个图。
ACBM算法中的BM算法的实现要比BM算法本身的实现要复杂一些,因为这是对BM算法的多模式一种扩展。
ACBM算法中的核心数据结构:
1、 MinLen,模式串集合中最短那个模式串的长度:比较失配时最多跳跃的字符个数不能超过Minlen。
2、 ACTree,由模式串集合构建出的状态树,构建方法和AC自动机的构建方法相同,而且不需要计算失效函数,比较简单。
3、 BCshift[256]:ACTree对应一个坏字符数组,当匹配失效时,查找该数组计算坏字符偏移量。
4、 GSshift:AC树的每一个节点对应一个好后缀偏移量。
ACBM算法的核心部分是计算BCshift和GSshift,可参考BM算法的实现。
自然而然的我们会想到结合AC算法和BM技术,因为在AC算法中,字符串是从左到右匹配的,如果字符串中和pattern很少的情况下ACBM算法大大的提高性能。
说了这么多,其实ACBM根本就不需要知道那么多,只需要为ACBM添加一个bad-character 的match:就是说,如果文本中当前字符上不匹配(假设为b),模式串跳到最后一个出现b的位置
相关文章推荐
- NUL 与 NULL
- iOS边练边学--tableView的批量操作
- AccountManagerFuture<V>
- 设计模式-七大结构型模式
- XML解析之DOM详解及与SAX解析方法的比较
- IOS CALayer(二)
- 正则表达式的简单语法及常用正则表达式 举例使用jquery获取url指定参数
- AngularJS 过滤器
- C#在Winform中使用GMap.Net地图开发控件在离线模式下绘制两点路线
- HDOJ 2019 数列有序!
- ❤BZOJ 2705: [SDOI2012]Longge的问题
- 【转】VMware网络连接模式—桥接、NAT以及仅主机模式的详细介绍和区别
- Python 练习册--生成唯一激活码(邀请码)
- openssl学习篇之base64编码、解码
- HDOJ 2018 母牛的故事
- 正在关闭接口 eth0:错误:断开设备‘eth0’
- LeetCode-Binary Tree Postorder Traversal
- 【matlab】:matlab如何写函数并且调用函数?
- DOM和JQUERY 对HTML标记修改的冲突之 swfobject
- 安装GLIBC