2017级计算机科学与技术系杜星亮.PDF

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Trie 2017级计算机科学与技术系 杜星亮 Trie 的结构 • Trie 是一棵有根树,由一个字符串集合 生成。 • Trie 的边对应字符集中的一个字符。 • Trie 的结点对应中一个或多个字符串的公共前缀。 Trie 的构建 • 初始:单结点树,表示空串 • 依次处理S 中的每个串s: • 记录当前结点cur,从根出发 • 依次处理s 中每个字符c: • 若cur 具有出边c,则直接将cur 移动至其c 后继; • 否则,为cur 添加c 后继并移动。 Trie 的构建 • = {,,} • 初始:单结点树,表示空串 • 依次处理S 中的每个串s: • 记录当前结点cur,从根出发 • 依次处理s 中每个字符c: • 若cur 具有出边c,则直接将cur 移动至其c 后继; • 否则,为cur 添加c 后继并移动。 Trie 的性质 • 任一结点对应一个前缀串。 • 问题:如何构造这个前缀串? 任一结点对应一个前缀串 • 一条从根到结点 的路径,将路径上的字符依次连接即得到v 所对 应的前缀串。 • 设 中所有字符串的前缀串(包含空串)构成集合 • 可以看出Trie 的结点和 的元素是一一对应的。 • 设函数: → 为结点 对应的前缀串, • 其逆为函数: → • 由此,结合树的性质,我们可以得到很多信息—— 任一结点对应一个前缀串 • ⊆ |P| • 问题:以前曾介绍过哪些树相关的算法? • DFS,BFS • MST • LCA 任一结点对应一个前缀串 • 设(,) 为串, 的最长公共前缀,则有 • (LC , ) = ( , ) Trie 的应用 • 查询前缀 • 前缀去重 • 前缀计数 • 附加信息…… 能够识别所有前缀的自动机 • 根据自动机的定义,可以将Trie 看成能接受S 中所有串的前缀串的 自动机。 • 我们能不能扩展一下这个自动机呢? 自动AC 机 AC 自动机??? • Aho-Corasick 自动机多模式匹配 • Alfred V. Aho • Margaret J. Corasick. KMP • KMP 的思路与单模板串匹配自动机思想类似,可以理解为一个压缩版 的自动机。 • 其核心是找到P 的每个前缀s 的最大的前缀等于后缀的长度。 AC 自动机= Trie + KMP • 我们把KMP 搬到Trie 上来: • Trie 每个结点都对应一个前缀,用结点替换掉 KMP 使用的下标 • 采用类似 KMP 的递推得到匹配失败时候的转移函数。 • 匹配时成功则沿Trie 的树边移动,否则沿上面得到的转移函数移动 • 或者可以直接把失败转移函数直接添加到Trie 上得到Trie 图。 AC 自动机= Trie + KMP Trie 扩展 • 把一个字符串的所有后缀加到一个Trie 中,得到未压缩版的后缀树。 • 虽然粗略考虑,后缀树的结点规模是平方级别的, • 但已有论文证明,本质不同的后缀数量是线性级别的。 • 与其相关的还有后缀自动机。 • 通过后缀树,可以识别一个字符串的所有子串。 OJ 联动 • 本周OJ 中有一道题需要使用Trie 。 • 讲题时会给一个Trie 的参考实现。 谢谢大家 2019年4月

文档评论(0)

fengruiling + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档