`

关于后缀树的一些理解

阅读更多
要理解suffix tree就首先要理解Trie
还好我在刚进雅虎的时候接触到了Double Array Trie的一个具体实现
对Trie有着比较深刻的了解。
Trie的优势就是他能在o(n)时间内搜索一个长度为n的字符串s是否在字典里。
关于Trie的资料,有下面几个链接可以参考
http://www.allisons.org/ll/AlgDS/Tree/Trie/
http://linux.thai.net/~thep/datrie/datrie.html

言归正传,简单点说,后缀树就是将一个给定字符串的所有后缀全部压入一个Trie
然后将只有单个叶子的节点压缩,从而形成的一棵树
关于后缀树如何构造,有很多资料进行介绍,就不多说了
例如:
http://www.allisons.org/ll/AlgDS/Tree/Suffix/
上面这个网页里有一个手动构造后缀树的例子,非常生动

我更关注的是后缀树的用途,总结起来大概有如下几种
1. 查找字符串o是否在字符串S中。
方案:用S构造后缀树,按在trie中搜索字串的方法搜索o即可。
原理:若o在S中,则o必然是S的某个后缀的前缀。
听起来有点拗口,举个例子。例如S: leconte,查找o: con是否在S中
则o(con)必然是S(leconte)的后缀之一conte的前缀
有了这个前提,采用trie搜索的方法就不难理解了。
2. 指定字符串T在字符串S中的重复次数。
方案:用S+’$'构造后缀树,搜索T节点下的叶节点数目即为重复次数
原理:如果T在S中重复了两次,则S应有两个后缀以T为前缀,重复次数就自然统计出来了。
3. 字符串S中的最长重复子串
方案:原理同2,具体做法就是找到最深的非叶节点。
这个深是指从root所经历过的字符个数,最深非叶节点所经历的字符串起来就是最长重复子串。
为什么要非叶节点呢?因为既然是要重复,当然叶节点个数要>=2。
4. 两个字符串S1,S2的最长公共部分
方案:将S1#S2$作为字符串压入后缀树,找到最深的非叶节点,且该节点的叶节点既有#也有$(无#)。
大体原理同3

上段文字可能表达不够准确,更准确的表达可以参考
http://www.allisons.org/ll/AlgDS/Tree/Suffix/
http://blog.csdn.net/g9yuayon/archive/2008/06/21/2574781.aspx
当然英文wiki和google也是很好的参考资料~
分享到:
评论
2 楼 whxtbest 2015-08-18  
whxtbest 写道
2里面:如果T本身就是重复的话   比如S是aaab,T是aa的话,这个时候是不是就有问题了

看了一下,aa应该就是aaab的最长重复子串,是允许有重叠的部分的
1 楼 whxtbest 2015-08-18  
2里面:如果T本身就是重复的话   比如S是aaab,T是aa的话,这个时候是不是就有问题了

相关推荐

    后缀树生成方式源码

    后缀树有很多的生成方式,但很多方式都比较复杂,编码难度大。这是我总结出的一种生成方式,非常好理解,初学者都可以编写出正确的代码,而且生成速度也很快。代码里有方法介绍和详细注释。

    后缀树代码

    后缀树及其相关功能(如找最大子串等),参考https://www.oschina.net/translate/ukkonens-suffix-tree-algorithm-in-plain-english网站的UKKonen算法讲解(较易理解)与...abacabdabcdacad等

    da算法-后缀树的基本思想

    对后缀数组的理解与分析,有助于快速理解并学习后缀数组的定义与运用

    Cracking the Coding Interview PDF

    后缀树这个特殊的结构在《算法导论》等众多书中都没有出现,可以在网上找到一些计算生物学的课件。很多匹配字符串相关的问题都可以用后缀树或者广义后缀树给出一个线性解法。但注意的是这个数据结构所占用的空间也是...

    数据结构--数据结构的组织方法.pdf

    常见的数据结构:栈、队列、数组、链表、树、图、字典树(⾼效树形结构)、散列表(哈希表) Java常⽤数据结构(图解): 图⽚源⾃于: 1、栈和队列: 2、栈(stack):先进后出,删除与加⼊均在栈顶操作 栈也称为...

    算法文档,来看看吧

    [原网页] [置顶] 程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大系列集锦 [原网页] 程序员编程艺术第三十~三十一章:字符串转换成整数,通配符字符串...[原网页] 从Trie树(字典树)谈到后缀树(10.28修订)

    C++数据抽象和问题求解(第6版).[美]Frank M. Carrano(带详细书签).pdf

    书中使用的软件工程原则和概念以及UML图便于增强学生的理解。 ◆ 详细介绍了数据抽象,强调规范和实现之间的区别 ◆ 广泛介绍了各种面向对象的编程技术 ◆ 重点是核心的数据结构,而不是非必要的C++语言语法 ◆ ...

    algorithm:算法和数据结构学习笔记

    主要处理边缘情况时间/空间复杂度分析专题排序链表题LRU 二分位运算栈和含量堆二叉树贪心并查集图动态规划单调栈滑动窗口和双指针完美洗牌问题斐波那契问题和扩展蓄水池算法计算表达式首要树Manacher算法KMP算法...

    leetcode中关于dfs解体思路-Personal-Notes:个人笔记

    leetcode中关于dfs解体思路 Personal-Notes 总思路 不贪图运行时间最快,但算法复杂度需要尽可能低 思路要易于理解,代码要尽可能短,每条思路所对应的代码最好要形成模板 String基本操作 s2 = "shaunwei" s2[-3:] =...

    leetcode2sumc-jalgorithmCPP:算法CPP

    包括我在网上遇到的一些算法我在 GeeksforGeeks.org、Hackerrank.com、Topcoder.org 等网站上积极研究新算法。 这个解决方案 配置为 2 个 CMake 解决方案:src 和 test。 每个解决方案中的文件结构是相同的。 与单元...

    leetcode中国-Data-Structures-And-Algorithms-Roadmap:数据结构和算法路线图

    理解递归 基本递归问题 了解回溯 分而治之的算法 • 排序算法 插入排序 二元插入排序 选择排序 冒泡排序 归并排序 快速排序 基数排序 • 二分搜索应用程序 二分搜索算法 数组的二分搜索 矩阵上的二分搜索 • 链表 ...

    计算机要学哪些东西----(还有附赠哦)

    每个单元都用一个领域名加一个数字后缀表示,比如OS3是关于并发的单元。各个单元由被细分成主题(topics),这是CS知识体层次结构的最底层。 离散结构(DS) DS1. 函数,关系,集合[核心] DS2. 基本逻辑[核心] DS3. ...

    传智播客扫地僧视频讲义源码

    11_c的学习重理解到位_对初学者_传智扫地僧 12_直接通过内存标号操作内存空间_课堂答疑 13_中午课程回顾 14_内存四区基本原理_全局区案例理解 15_内存四区_堆栈案例理解 16_课堂答疑_理解指针的关键关键在内存 17_vs...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    他善于用容易理解的方法和语言说明复杂的概念。许多人认为他开创了计算机书籍贴近大众的新风,为我国的计算机普及事业做出了重要的贡献。 谭浩强教授曾获全国高校教学成果国家级奖、国家科技进步奖,以及北京市政府...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    他善于用容易理解的方法和语言说明复杂的概念。许多人认为他开创了计算机书籍贴近大众的新风,为我国的计算机普及事业做出了重要的贡献。 谭浩强教授曾获全国高校教学成果国家级奖、国家科技进步奖,以及北京市政府...

    GoodProject Maven Webapp.zip

    jQuery EasyUI 提供了用于创建跨浏览器网页的完整的组件集合,包括功能强大的 datagrid(数据网格)、treegrid(树形表格)、 panel(面板)、combo(下拉组合)等等。 用户可以组合使用这些组件,也可以单独使用其中一个。 ...

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    DTD文件也是一个ASCII的文本文件,后缀名为.dtd。例如:myfile.dtd。 为什么要用DTD文件呢?我的理解是它满足了网络共享和数据交互,使用DTD最大的好处在于DTD文件的共享。(就是上文DTD说明语句中的PUBLIC属性)。...

    华为-3com日志解释器V2.0.rar

    9:工具运行说明:工具在打开、过滤 日志时,会在工具软件所在的文件夹里生成必要的临时文件,文件后缀是 .temp格式。这些文件就是过滤操作得到的结果文件,并且这些文件的内容将会显示到主界面上。在工具软件的...

    入门学习Linux常用必会60个命令实例详解doc/txt

    要想真正理解Linux系统,就必须从Linux命令学起,通过基础的命令学习可以进一步理解Linux系统。 不同Linux发行版的命令数量不一样,但Linux发行版本最少的命令也有200多个。这里笔者把比较重要和使用频率最多的命令...

Global site tag (gtag.js) - Google Analytics