- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
多串匹配算法及其启示
南京市外国语学校 朱泽园
[关键字] 模式串 单词前缀树 后缀树 串匹配
[摘要]
字符串处理在实际应用中具有重要地位,其看似简单,但随着研究的深入,各类思想精华涌现其中,难度也变得深不可测。因此信息学竞赛中常以字符串处理为题,锻炼选手的创新能力。
本文第一章提出问题并进行朴素的分析,第二、三、五章分别介绍三个辅助算法:KMP模式匹配算法、自创的单词前缀树算法,以及后缀树算法。另外基于KMP算法的核心思想,在第四章中,面向“多串匹配”问题提出一个线性算法。但本文并没有满足于线性时间复杂度,接着在第六章提出了平均性能更好的算法。最后第七章对算法的构思进行了剖析,并将这种思想方法上升到理论高度。
[目录]
§1 问题的提出
§1.1 问题描述
§1.2 最初想法
§2 Knuth-Morris-Pratt算法
§2.1 定义
§2.2 模式串的前缀函数(Prefix Function)
§2.3 kmp主算法
§3 单词前缀树
§3.1 单词查找树(Trie)的定义
§3.2 单词树的建立
§3.3 前缀指针的定义
§3.4 前缀指针的生成
§4 主算法一(线性算法)
§4.1 kmp算法的启发
§4.2 单词前缀树的使用及附加标记
§4.3 单词前缀树的时间复杂度
§4.4 主过程
§4.5 时空复杂度
§4.6 该算法的一些扩展
§5 后缀树和McCreight算法
§5.1 数据结构
§5.2 一些定义
§5.3 建立后缀树(初步)
§5.4 后缀链接
§5.5 建立后缀树
§6 主算法二(平均性能更好的算法)
§6.1 单词前缀树的使用和扩展
§6.2 后缀树的使用和扩展
§6.3 TreeA和TreeB上的两个函数
§6.4 主过程
§6.5 一个例子
§6.6 时间复杂度分析
§7 启示和总结
§7.1 算法分析
§7.2 启示
§7.3 总结
[正文]
§1 问题的提出
§1.1 问题描述
所谓多串匹配,就是给定一些模式串,在一段文章(只出现小写a到z这26个字母)中,找出第一个出现的任意一个模式串的位置。具体来说就是:
给定m个长度分别为L1、L2……Lm的模式串数组P1[1..L1]、P2[1..L2]……Pm[1..Lm],假设正文为一个长度为n的数组T[1..n],限定。我们要找到一个最小的整数,满足
使得 都有
注:如模式串为cdefg与efg,正文为abcdefgh时,会造成匹配目标的不明确,因此我们一般将“求所有模式串的所有出现位置”这一任务模糊,转而求“第一个”(不过接下来将介绍的算法,可以在不改变复杂度的情况下完全接受此任务)。
含逻辑关键字的搜索引擎是这个问题的实际应用。医学家们在DNA序列中,搜索可能为变异的几种模式,也是这类问题的典型。因此用有效算法解决该问题能大大提高各行各业的工作效率!
§1.2 最初想法
最朴素的想法是:
该算法从小到大枚举每一个位置,并且进行检查。最坏情况下时间复杂度为。
另一个有效的优化是:
其中Pi在T中第一次出现的位置,可以通过kmp算法(下一章将提到),在内完成。因此总复杂度为。
可惜这两种方法面对我们即将解决的数据量,是力不从心的,我们应该努力想出一种线性,或者更优秀的算法。为此,我们要先介绍一个预备算法——kmp(Knuth-Morris-Pratt)单串匹配算法,和一个预备数据结构——单词前缀树。
§2 Knuth-Morris-Pratt算法
该算法为D.E.Knuth、J.H.Morris和V.R.Pratt同时发现的,被称作“克努特——莫里斯——普拉特操作”,简称kmp算法。
§2.1 定义
给定一个长度为m的模式串P[1..m],和一个长度为n的正文T[1..n],找到所有的整数,满足:
对于 都有 。
§2.2 模式串的前缀函数(Prefix Function)
对有前缀函数,如错误!链接无效。:
该函数可以通过如下程序段在数组中完成预处理:
因为k的增加值最多为m-1(最多进行m-1个“k(k+1”),所以“k(π[k]”的执行数量不会超过m-1次。该程序段的复杂度为。
§2.3 kmp主算法
因为前缀函数记录了模式串自身的位移匹配信息,所以在串匹配算法中,遇到了不匹配的字符,就可以根据前缀函数进行适当的调整,而不需要进行重新的比对。
如错误!链接无效。,当我们在串中匹配到了“”的时候,可以根据π[5]=3,将模式串右移5-3=2格,再接着比对(如果还不匹配,再根据π进行右移……)。
类似于计算前缀数组的方法,我们也不难写出这段主算法的伪代码:
与计算前缀函数的算法相同,q(π[q]的执行次数不会超过n次。因此,整
文档评论(0)