数据结构与算法学习(十四)——字符串匹配算法(二)

上一篇讲的BF、RK、BM、KMP算法都是单模式串匹配算法,即一个主串与一个模式串匹配,本篇将介绍两种多模式串(一个主串与多个模式串匹配)匹配算法——Trie树和AC自动机

Trie树

1、Trie树又叫字典树,用来解决一组字符串集合中快速查找某个字符串。其中一组字符串对应的就是模式串,某个字符串指的就是主串。
2、Trie树本质:利用字符串中的公共前缀,将重复的前缀合在一起,构成一棵树。
例有一组字符串:hello hi her how see so,构成的Trie树如下:
在这里插入图片描述
(1)根节点不含任何信息
(2)一条路径表示一个字符串
3、Trie树的存储方式
(1)用一个下标与字符映射的数组存储子节点的指针。假设字符串全是小写字母,则用a~z 26个字母存储每个节点。上面一层为a-z 26个字母,下面一层则指向子节点。
(2)数组下标为0的位置指向子节点a的指针,下标为1的位置指向子节点b的指针…若子节点不存在,则该下标为null。
(3)查找字符串时,直接用ASCII的计算。要查找字母x与字母a的ASCII差值即为x节点的存储下标。

第一层为根节点,第二层为h、s节点。
在这里插入图片描述
4、Trie树与散列表、红黑树的区别
(1)Trie树要求字符串集不能太大,且要求字符串的前缀重合较多
(2)使用Trie树需要自己构建Trie树,相比于散列表和红黑树可以直接用现成的封装类,难度要大一些。
(3)Trie树使用指针,会使串起来的数据块不连续,对缓存不友好,性能下降
因此综上三点所述,精确查找使用散列表和红黑树更好一些,不需要自己动手实现,且性能稳定。
但Trie树适合查找前缀匹配的字符串,例如搜索引擎中的搜索关键字的提示功能。

AC自动机

1、AC自动机的本质就是在Trie树上引用了KMP算法的next数组实现,因此AC自动机也是树结构。
next数组是KMP算法实现中的一个存储结构:数组下标为好前缀字符串的各前缀子串的最后下标,数组值为与该前缀子串匹配的最长匹配后缀子串(该后缀子串为好前缀的后缀子串)的最后下标。若无最长匹配后缀子串,则记为-1。
2、构建AC自动机:
(1)先将多个字符串构建成Trie树
(2)在Trie树上构建失败指针:字符串{a}的后缀子串{p}与其他模式串的前缀子串可匹配的最长前缀子串{q},将{p}的最后节点指向{q}的最后节点,即为失败指针。
字符串:abc的最长可匹配前缀子串为bc,即abc中的c节点的失败指针为bc中的c节点
在这里插入图片描述
(3)在AC自动机上匹配主串
3、AC自动机适用于大量文本的场景,应用于过滤敏感词系统。例一篇文章中需要过滤敏感词。

图源:王争——数据结构与算法之美

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值