多模匹配算法AC算法和单模匹配算法BM

多模匹配算法之AC算法详解
算法概述
    Aho-Corasick算法
-    这是一种字典匹配算法,它用于在输入文本中查找字典中的字符串。时间复杂度是线性的。该算法应用有限自动机巧妙地将字符比较转化为了状态转移。
    该算法的基本思想
−    在预处理阶段,AC自动机算法建立了三个函数,转向函数goto,失效函数failure和输出函数output,由此构造了一个树型有限自动机。
−    在搜索查找阶段,则通过这三个函数的交叉使用扫描文本,定位出关键字在文本中的所有出现位置。
    字典树的构造
-    要匹配的一些字符串添加到树结构中去,树边就是单词中的字符,单词中最后一个字符的连接节点添加标志,以表示改节点路径包含1个字典中的字符串,搜索到此节点就表示找到了字典中的某个单词,可以直接输出。

例:模式串集合 P={he,she,his,hers},下面的分析都根据这个集合展开

 
                               图1
转向函数goto原理
我们规定g(state1,ch) = state2.:状态state1 经过 字符ch 可以到达状态state2 。(1)模式串he:g(0,h)=1  g(1,e)=2   模式串he的转向函数构造完毕;
(2)模式串she:g(0,s)=3  g(3,h)=4  g(4,e)=5  模式串she构造完毕;
(3)模式串his:g(0,h)=1  g(1,i)=6  g(6,s)=7 模式串hers构造完毕;
(4)模式串hers:g(0,h)=1 g(1,e)=2  g(2,r)=8  g(8,s)=9 模式串hers构造完毕;
 注:(3)中g(0,h)为何不跳到6状态,原因(这个跳转也已存在,所以无需在添加新的状态),(4)中的g(0,h)=1 g(1,e)=2一样的原因。
   整个模式串集合构造完毕。可以根据转向函数画出上面的图1。
输出函数output原理
在转向函数构造的基础上实现输出函数output()。模式串he最后的状态为状态2。当模式匹配的时候遇到状态2。说明待匹配的字符串,已经匹配到了模式串he。在构造模式串的转向函数的结尾,来完成output函数的构建。
失效函数failure原理
      在转向函数的基础上实现失效函数f()。规定:深度为1的状态失效跳转到状态0,即f(1)=0,f(3)=0;(因为第一个字符匹配都失败了,所以只能从新开始匹配)
      当前字符无匹配,表示当前状态的任何一条路径都无法达到下一跳,此时不能沿现有路径前进,只能回溯,回溯到存在的最长的后缀字符串处,如果没有任何后缀字符串匹配则回溯到树根处。然后从当前回溯节点判断是否可以到达目标字符串字符。
失效函数理解有些难。算法的实现却很巧妙。
失效函数算法:
规定:f(1) = 0   f(3) = 0 ; (第一个字符匹配都失败了,所以只能从新开始匹配)
g(1,e) = 2;    f(2) = g(f(1),e) = g(0,e) = 0;
  g(1,i) = 6;    f(6) = g(f(1),i) = g(0,i) = 0;
  g(3,h) = 4;    f(4) = g(f(3),h) = g(0,h) = 1;
  g(2,r) = 8;    f(8) = g(f(2),r) = g(0,2) = 0;
  g(6,s) = 7;    f(7) = g(f(6),s) =  g(0,s) = 3;
  g(4,e) = 5;    f(5) = g(f(4),e) = g(1,e) = 2;
  g(8,s) = 9;    f(9) = g(f(8),s) = g(0,s) = 3;
  注:此图所构造的失效函数跳转没有遇到失败的情况,有可能会出现失效的情况,具体培训的时候会讲到。(f(N) = g(f(M),s) | g(f(f(M)),s)......如果前面任意的一个跳转不为-1,就赋值给f(N)).
所有的失效跳转构造完毕 ,可以得到: 
state    1    2    3    4    5    6    7    8    9
f    0    0    0    1    2    0    3    0    3
算法实现的失效状态的先后顺序:1,3,2,6,4,8,7,5,9
通过队列的方式来实现:首先深度为1的状态入队列1和3入队列,然后1出队列的同时它的下一跳2和6入队列。然后3出队列的同时它的下一跳4入队列,下一步2出队列它的下一跳8入队列;下一步6出队列它的下一跳7入队列;直到9出队列,队列为空,失效函数构建完毕。

算法使用的存储结构
1.AC字典树的存储结构
typedef struct 
{
             int acsmMaxStates;                 /*总的模式串的长度*/
             int acsmNumStates;                 /*状态,实现跳转函数g*/
             ACSM_PATTERN    * acsmPatterns;    /*模式串链表头*/
             ACSM_STATETABLE * acsmStateTable;  /*状态链表,g*/
}ACSM_STRUCT;
/*ACSM_STRUCT * acsm*/
/*acsm->acsmStateTable[M].NextState[i] = N; 意思就是g(M,i) = N;*/

2. 模式串存储结构
typedef struct _acsm_pattern
      {      
          struct  _acsm_pattern    *next;
          unsigned char     *patrn;       /*经过转化以后的模式串*/
          unsigned char     *casepatrn;   /*源模式串*/
          int      n;                     /*源模式串长度*/
          int      nocase;                /*模式串是否进行大小写转化*/
          void    *id;                    /*保留字段,未用*/
          int         nmatch;              /*该模式串所匹配的次数*/
} ACSM_PATTERN;
3.状态表
typedef struct  
{    
             int  NextState[ ALPHABET_SIZE ];  /*下一跳*/
             int  FailState;                   /*失效函数f的跳转*/
             ACSM_PATTERN *MatchList;          /*输出函数的存储链表头*/ 
}ACSM_STATETABLE;
转向函数goto的实现
转向函数g(状态,字符) = 下一个状态的构建。                                     
例:模式串集合(he,she,his,hers)                                                 
第一个模式串he,g(0,h)=1, g(1,e)=2;                                         
第二个模式串she,g(0,s)=3, g(3,h)=4,g(4,e)=5;                                
第三个模式串his, g(0,h) =1,g(1,i)=6,g(6,s)=7;                               
第四个模式串hers, g(0,h) =1, g(1,e)=2,g(2,r)=8,g(8,s)=9.                    
*如果字符匹配到了状态2,5,7,9就说明了已经匹配上了关键字。构建输出函数output。  
static void AddPatternStates (ACSM_STRUCT * acsm, ACSM_PATTERN * p)             
{                                                                               
unsigned char *pattern;                                                      
int state=0, next, n;                                                       
n = p->n;                                                                   
pattern = p->patrn;                                                         

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/279541.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot通过注解+切面实现接口权限校验

Springboot通过注解+切面实现接口权限校验 主要说一下在对接口请求时,如何用注解切面去拦截校验当前登录用户是否有访问权限 1.首先创建注解 HasPermission ,跟普通注解创建方式基本一致 Retention(RetentionPolicy.RUNTIME) Target(Element…

小火星露谷管理器 报错:“你似乎没有安装Edge的webview2”

错误 解决办法 你可以到这个地方下载安装webview2 https://developer.microsoft.com/zh-cn/microsoft-edge/webview2/?formMT00IS

2024年亚洲图像处理趋势会议(ATIP 2024)即将召开!

2024年亚洲图像处理趋势会议(简称:ATIP 2024)将于2024年6月21日至23日在英国伦敦举行。在会议上我们将与相关领域的研究人员和知名专业人士共同讨论关于图像处理学科的最新研究方向及进展,评估当前最先进的技术和未来研究的关键领…

Tomcat(Win+Linux)安装教程

Windows环境安装 Tomcat安装及配置教程主要分为四步: 步骤一:确认自己是否已 安装JDK🔍 步骤二:下载安装Tomcat 步骤三:Tomcat配置环境变量 步骤四:验证Tomcat配置是否成功 OK,我们开始&#x…

数据库基本介绍及编译安装mysql

目录 数据库介绍 数据库类型 数据库管理系统(DBMS) 数据库系统 DBMS的工作模式 关系型数据库的优缺点 编译安装mysql 数据库介绍 数据:描述事物的的符号纪录称为数据(Data) 表:以行和列的形式组成…

python大学生健身爱好者交流网站flask-django-nodejs-php

任何系统都要遵循系统设计的基本流程,本系统也不例外,同样需要经过市场调研,需求分析,概要设计,详细设计,编码,测试这些步骤,基于python技术、django/flask框架、B/S机构、Mysql数据…

【No.13】蓝桥杯二分查找|整数二分|实数二分|跳石头|M次方根|分巧克力(C++)

二分查找算法 知识点 二分查找原理讲解在单调递增序列 a 中查找 x 或 x 的后继在单调递增序列 a 中查找 x 或 x 的前驱 二分查找算法讲解 枚举查找即顺序查找, 实现原理是逐个比较数组 a[0:n-1] 中的元素,直到找到元素 x 或搜索整个数组后确定 x 不在…

linux网络服务学习(1):nfs

1.什么是nfs NFS:网络文件系统。 *让客户端通过网络访问服务器磁盘中的数据,是一种在linux系统间磁盘文件共享的方法。 *nfs客户端可以把远端nfs服务器的目录挂载到本地。 *nfs服务器一般用来共享视频、图片等静态数据。一般是作为被读取的对象&…

国内git最新版本下载链接2.44

git官网地址:Git - Downloading Package (git-scm.com) 蓝奏云: ​​​​​​gGit-2.44.0-64-bit.exe - 蓝奏云 git仓库地址:git/git: Git Source Code Mirror - This is a publish-only repository but pull requests can be turned into patches to the mailing list via …

算法笔记p251队列循环队列

目录 队列循环队列循环队列的定义初始化判空判满入队出队获取队列内元素的个数取队首元素取队尾元素 队列 队列是一种先进先出的数据结构,总是从队尾加入元素,从队首移除元素,满足先进先出的原则。队列的常用操作包括获取队列内元素的个数&a…

Typecho博客后台登陆界面美化

登录界面: 食用方法: 备份 admin 目录 压缩包内容上传到 admin 目录内。 结构:网站根目录 /admin/login.php 结构:网站根目录 /admin/style 修改 login.php 第35行,把“季春二九管理后台”替换成自己的信息 清理缓存,开始体验新的…

释放创造力,Nik Collection 6 by DxO 点亮你的视觉世界

在数字摄影时代,后期处理是提升摄影作品品质的重要环节。而Nik Collection 6 by DxO作为一套优秀的滤镜插件套装,不仅为摄影师提供了丰富的后期处理工具,更让他们能够释放无限的创造力,打造出惊艳的视觉作品。 Nik Collection 6 …

虚拟游戏理财 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C++ 题目描述 在一款虚拟游戏中生活,你必须进行投资以增强在虚拟游戏中的资产以免被淘汰出局。 现有一家Bank,它提供有若干理财产品m,风险及投资回报不同,你有N (元)进行投资,能接受的总风,险值为X。 你要在可接…

WanAndroid(鸿蒙版)开发的第六篇

前言 DevEco Studio版本:4.0.0.600 WanAndroid的API链接:玩Android 开放API-玩Android - wanandroid.com 其他篇文章参考: 1、WanAndroid(鸿蒙版)开发的第一篇 2、WanAndroid(鸿蒙版)开发的第二篇 3、WanAndroid(鸿蒙版)开发的第三篇 …

Android Studio实现内容丰富的安卓视频管理平台

获取源码请点击文章末尾QQ名片联系,源码不免费,尊重创作,尊重劳动 项目编号081 1. 开发环境 android stuido 2.功能介绍 安卓端: 1.注册登录 2.本地视频 3.视频播放 4.收藏功能 5.网路视频 6.个人中心 7.我的收藏 8.浏览历史 3.系…

Java设计模式 | 简单工厂模式

概述 需求 设计一个咖啡店点餐系统设计一个咖啡类(Coffee);并定义其两个子类(美式咖啡AmericanCoffee和拿铁咖啡LatteCoffee);再设计一个咖啡店类(CoffeeStore),其具备…

一文搞定JVM相关的命令汇总,推荐收藏!

一、简介 虽然目前市场上有很多成熟的 JVM 可视化监控分析工具,但是所有的工具其实都依赖于 JDK 的接口和底层相关的命令,了解这些命令的使用对于我们在紧急情况下排查 JVM 相关的线上故障,会有更加直观的帮助。 下面我们一起来看看 JVM 常…

云服务器2核4g能支持多少人同时访问?腾讯云和阿里云PK

腾讯云轻量应用服务器2核4G5M配置性能测评,腾讯云轻量2核4G5M带宽服务器支持多少人在线访问?并发数10,支持每天5000IP人数访问,腾讯云百科txybk.com整理2核4G服务器支持多少人同时在线?并发数测试、CPU性能、内存性能、…

智慧安全:守护智慧城市的安全屏障

随着信息技术的迅猛发展,智慧城市已成为现代城市发展的重要方向。智慧城市通过集成应用先进的信息通信技术,实现城市管理、服务、运行的智能化,为城市的可持续发展注入了新的活力。然而,在智慧城市的建设过程中,安全问…

综合系列之大四学生如何摆脱焦虑,找回自己?

注意: 焦虑是一种常见的情绪,它通常表现为紧张、不安、恐惧和担忧等情绪。当焦虑情绪影响到日常生活和工作时,就需要采取适当的措施来应对。 一、焦虑原因 1. 就业压力:随着毕业的临近,可能会感到就业压力增大&#xf…