后缀树和后缀数组.docVIP

  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文档。上传文档
查看更多
后缀树和后缀数组.doc

后缀树和后缀数组 基本概念 子串:字符串S的子串S[i..j],i≤j,表示S串中从i到j这一段,也就是顺次排列S[i],S[i+1],...,S[j]形成的字符串。 字符集:一个字符集Σ是一个建立了全序关系的集合,也就是说,Σ中的任意两个不同的元素α和β都可以比较大小,要么αβ,要么βα(也就是αβ)。字符集Σ中的元素称为字符。 字符串:一个字符串S是将n个字符顺次排列形成的数组,n称为S的长度,表示为len(S)。S的第i个字符表示为S[i]。 子串:字符串S的子串S[i..j],i≤j,表示S串中从i到j这一段,也就是顺次排列S[i],S[i+1],...,S[j]形成的字符串。 后缀:后缀是指从某个位置i开始到整个串末尾结束的一个特殊子串。字符串S的从i开头的后缀表示为Suffix(i),也就是Suffix(i)=S[i..len(S)] 例如S = mississippi,那么它的所有后缀为: Suffix(1) = mississippi = S Suffix(2) = ississippi Suffix(3) = ssissippi Suffix(4) = sissippi Suffix(5) = issippi Suffix(6) = ssippi Suffix(7) = sippi Suffix(8) = ippi Suffix(9) = ppi Suffix(10) = pi Suffix(11) = i Suffix(12) = (empty) 不难发现,S的任意一个子串一定是某一个后缀的前缀。 字符串的大小比较:指通常所说的“字典顺序”比较,也就是对于两个字符串u、v,令i从1开始顺次比较u[i]和v[i],如果u[i]=v[i]则令i加1,否则若u[i]v[i]则认为uv,u[i]v[i]则认为uv(也就是vu),比较结束。如果ilen(u)或者ilen(v)仍比较出结果,那么若len(u)len(v)则认为uv,若len(u)=len(v)则认为u=v,若len(u)len(v)则uv。 Trie Trie是一棵树,它的结点(或全部用边)是∑中单个字符,每个结点的所有子结点字符都不同,从树根到某一个叶结点所经过路径中的字符就构成一个字符串。 上图的Trie存放了字符串”aa”和”ab”。但是这样的话,我们无法再存储字符串”a”,所以引入$这个不在∑的字符,让它成为叶结点。下图的Trie就存放了字符串”a”和”aa”。 还有另一种实现方法,不添加$,而在节点上做标记。 Trie的构造和查找 增量式:每次插入一个串S 从根开始,依次检查S的每个字符,沿着边走 如果串结束,则标记当前结点为S的终点 如果走到叶子时串未结束,给该叶子增加子树 “沿着走”需要定位每个结点的指定儿子,给叶子增加子树需要修改结点的儿子集合。小字典用数组,大字典用Hash。一般情况只考虑小字典,可以在常数时间内完成儿子的查找和插入。因此,在Trie中查找和插入串P,时间为O(|P|)。 为了减少不分支的结点所带来的浪费,将Trie改进为压缩Trie。压缩Trie与Trie类似,只是将没有分支的连续结点压缩存放在同一个结点中。下图左边是一般的Trie,右边是压缩Trie。 后缀树的定义 后缀树(Suffix Trees)是一种能快速处理很多与字符串有关问题的数据结构。 严格定义:串S[1…m]$的后缀树(suffix tree)是一棵有根树T,它有m个叶子(一一对应),标记为1,2,…,m。除根之外每个内结点都至少有两个儿子(没有局部链),每条边上有S的一个非空子串,且同一结点出发的任两条边上标记的子串的第一个字母都不相同。若用L(v)表示从树根走到结点v时经过所有边的子串连接,则对于i=1,2,…,m,有L(i) = S[i…m]。因此,后缀树代表了S所有后缀的集合。 如下图所示,就是字符串”banana”的后缀树。 后缀树的实现 先来看看后缀树所耗费的空间。如果按照上面描述的方法存储,由于每个结点存的都是字符串,这样在最坏的情况下,需要平方级的空间,例如字符串”abcd…xyz”。 但如果我们在每个结点只存储起始和终止下标,那么就是线性的了。 因为不难发现,根据压缩trie的特点,每一个内部结点都是要分支的。所以内部结点的个数不超过叶结点的个数,而叶结点的个数正好等于|T|。并且每个结点只存两个数值,于是空间是线性的。 既然空间是线性的,我们就有希望在线性时间内将之构造出来( 事实上,后缀树确实可以在线性时间内构造出来! Weiner 1973:太复杂,内存开销太大 McCreight 1976:仍然复杂 Ukkonen 1995:在线算法,内存更省 Ukkonen算法是在线算法,即: 一个字符一个字符的处理S 处理完S的前k个字

文档评论(0)

xx88606 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档