- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)