冬令营讲稿_刘汝佳partI【信息技术】.pptVIP

冬令营讲稿_刘汝佳partI【信息技术】.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
2006全国信息学奥林匹克 冬令营讲稿 两个复杂的经典问题 NOI-SC 刘汝佳 目录 后缀树的线性时间构造 ——Trie, 后缀树, Ukkonen算法 一般图的最大权匹配 ——二分图匹配、线性规划、Gabow算法 为什么要学习这两个问题 加深对相关知识和方法的认识和理解: 字符串匹配、图论、线性规划 其中包含很多巧妙的思路, 很有启发性 学习复杂算法是一个挑战. 算法的背景、动机、出发点、步骤、正确性证明、复杂度分析、细节处理、程序实现等方面都需要仔细推敲 后缀树的线性时间构造 字符串的集合: Trie 从后缀Trie到后缀树 Ukkonen算法: 思想和简单实现 三阶段定理 完整的Ukkonen算法 字符串的集合: Trie 下图是{he, she, his, hers}的Trie Trie的构造和查找(1) Trie的构造 增量式: 每次插入一个串S 从根开始,依次检查S的每个字符, 沿着边走 如果串结束, 则标记当前结点为S的终点 如果走到叶子时串未结束, 给该叶子增加子树 Trie的构造和查找(2) “沿着走”需要定位每个结点的指定儿子 给叶子增加子树需要修改结点的儿子集合 在线串匹配问题 给一个庞大的文本串T,要求用尽量少的预处理时间,使得对于每个模板串P,可以在O(|P|)时间内判定P是否在T中出现 实际应用:文本数据库的建立和搜索 为什么预处理时间要尽量少?因为T非常大 为什么匹配时间要线性?因为询问可能非常多 KMP算法行么?当然不行!KMP的每次查询是O(|T|+|P|)的,而|T|可能非常大 在线串匹配问题 重点:需要对T进行预处理,使得匹配时不用重新检查T的每个字符 最简单的想法:把T的所有子串存在Trie里,则询问等价于在Trie中查询一个串 查询是O(|P|)的,但预处理… 子串是后缀的前缀 简单想法的失败之处在于:T的子串太多! 一定要储存所有子串么?不是的!可以只储存T的后缀, 因为子串是后缀的前缀 后缀只有m个,比子串总数低一阶,但所有后缀组成的Trie能很好的支持串匹配么?答案是肯定的,因为… 后缀Trie查找举例 边标记和终结符$ 后缀Trie有很多局部链。其实对于查找来说完全可以把局部链合并成一个结点,这样既节省空间也缩短查找时间 规定叶子和后缀一一对应,但对于aaaaa... 后缀树的严格定义 串S[1…m]$的后缀树(suffix tree)是一棵有根树T,它有m个叶子,标记为1,2,…,m。除根之外每个内结点都至少有两个儿子,每条边上有S的一个非空子串,且同一结点出发的任两条边上标记的子串的第一个字母都不相同。若用L(v)表示从树根走到结点v时经过所有边的子串连接,则对于i=1,2,…,m,有 后缀树举例 问题:子串可能很长,空间占用大 后缀树举例 解决方法:边上只记录起止位置(i,j) 后缀树的构造 使用起止位置表示子串,则空间复杂度为O(m),有希望在线性时间内构造出来 事实上,后缀树确实可以在线性时间内构造出来 Weiner 1973:太复杂,内存开销太大 McCreight 1976:仍然复杂 Ukkonen 1995:在线算法,内存更省 Ukkonen算法 Ukkonen算法是在线算法,即 一个字符一个字符的处理S 处理完S的前k个字符,得到S[1…k]的“后缀树” 注意:由于S[1…k]并不以$结尾,它可能并不存在后缀树,因此加上引号,称为隐式后缀树(implicit suffix tree)。S[1…k]的隐式后缀树记为Ti Ukkonen算法:从T1开始依次构造T2,T3,…,Tm,Tm+1,则Tm+1是真正的后缀树 后缀树的生长 Ukkonen每次从Ti构造Ti+1的过程称为一个阶段(phase),则整个过程被形象的称为“生长过程” 举例:axa$的三个阶段 生长的三种情况 把Ti生长为Ti+1,就是要给S[1…i]的每个后缀S[j…i]增加字符S[i+1] 情况一:S[j…i]以叶子结尾,则直接在S[i+1]的标号后增加字符S[i+1]即可 情况二:S[j…i]在中间结束,且后一个字符不是S[i+1],则在该处增加一个分支,连接到一个新叶子f。该边的编号为S[i+1]。如果结束点在一条边的中间,还需进行边分裂 情况三:S[j…i]在中间结束,且后一个字符就是S[i+1],则什么都不用做 给axabx的隐式后缀树增加b 三阶段定理 刚才的演示暗含了三阶段定理:每次生长过程总是依次进行 1次或多次情况1扩展(增加) 0次或多次情况2扩展(分裂) 0次或多次情况3扩展(空操作) 两个有用的结论 一日为叶子,终生为叶子 在所有阶段中,情况2扩展总次数为O(|S|) 实现细节 后缀的末尾称为“生长点”,则每阶段是在依次扩展每个生长点 生长点可以在结点上,也可以在边的

文档评论(0)

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

1亿VIP精品文档

相关文档