`
SunnyYoona
  • 浏览: 368555 次
社区版块
存档分类
最新评论

[算法系列之二十四]后缀树(Suffix Tree)

 
阅读更多

之前有篇文章([算法系列之二十]字典树(Trie))我们详细的介绍了字典树。有了这些基础我们就能更好的理解后缀树了。

一 引言 模式匹配问题

给定一个文本text[0…n-1], 和一个模式串 pattern[0…m-1],写一个函数 search(char pattern[], char text[]), 打印出pattern在text中出现的所有位置(n > m)。

这个问题已经有两个经典的算法:KMP算法 ,有限自动机,前者是对模式串pattern做预处理,后者是对待查证文本text做预处理。在进行完预处理后,可以到达O(n)的时间复杂度,n是text的长度。

后缀树可以用对text进行预处理,构造一个text的后缀树,就可以在 O(m) 的时间内搜索任意一个pattern,m是模式串pattern的长度。

二 简介

后缀树提出的目的是用来支持有效的字符串匹配和查询,例如上面的问题。后缀树(Suffix tree)是一种数据结构,能快速解决很多关于字符串的问题。后缀树的概念最早由Weiner 于1973年提出,既而由McCreight 在1976年和Ukkonen在1992年和1995年加以改进完善。

总结一句:一个给定的文本text的后缀树就是一个压缩的后缀字典树。

前面一篇文章我们已经讨论了 字典树(Trie),下面先让我们来了解一下压缩字典树( Compressed Trie)

三 压缩字典树( Compressed Trie)

我们以一下一组单词来介绍一下什么是压缩字典树:

{bear, bell, bid, bull, buy, sell, stock, stop}

我们以上面一组单词构建一个字典树如下:

这里写图片描述

下面就是压缩字典树。压缩字典树是从字典树转换而来,把字典树中的单节点链条进行压缩。即一个没有分叉的单边,进行压缩。

这里写图片描述

四 后缀压缩字典树

经过以上讨论,我们知道后缀树是文本text所有后缀的压缩字典树。一个后缀树的生成经过一下几步:
(1)生成给定文本text的所有后缀。
(2)视所有后缀为有效单词,生成一个压缩字典树。

我们以”banana\0”(’\0’是结束字符)为例,字符串的所有后缀为:

banana\0
anana\0
nana\0
ana\0
na\0
a\0
\0

假设我们考虑以上字符串的所有后缀均为有效单词,构造一个字典树如下:

这里写图片描述

如果我们合并单节点链条,我们得到如下压缩字典树,即给定文本”banana\0”的后缀树。

这里写图片描述

至此,我们已经了解了什么是后缀树了。

五 后缀树应用

(1)从目标串S中判断是否包含模式串T(Pattern Searching)

方案:用S构造后缀树,按在Trie中搜索子串的方法搜索T即可。
原理:若T在S中,则T必然是S的某个后缀的前缀。
例如:S = "leconte" T = "con",查找T是否在S中,则T(con)必然是S(leconte)的后缀之一"conte"的前缀。

(2)从目标串S中查找串T重复次数

方案:用S+'$'构造后缀树,搜索T节点下的叶节点数目即为重复次数
原理:如果T在S中重复了两次,则S应有两个后缀以T为前缀,重复次数就自然统计出来了。

(3)从目标串S中查找最长的重复子串(Finding the longest repeated substring)

方案:原理同2,具体做法就是找到最深的非叶节点。
这个深是指从root所经历过的字符个数,最深非叶节点所经历的字符串起来就是最长重复子串。
为什么要非叶节点呢?因为既然是要重复,当然叶节点个数要>=2。

(4)从目标串T和S中查找最长公共子串(Finding the longest common substr ing)

方案:将S1#S2$作为字符串压入后缀树,找到最深的非叶节点,且该节点的叶节点既有#也有$(无#)。

(5)从目标串T中查找最长的回文子串(Finding the longest palindrome in a string)

引用:

Pattern Searching | Set 8 (Suffix Tree Introduction)
Trie

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    后缀树算法 suffix_tree

    后缀树是类似字符串处理的有用的数据结构和算法。

    后缀树线性时间实现--c++

    后缀树线性时间构建,Ukkoen算法 Suffix tree creation

    Algorithm-Ukkonen-s-Suffix-Tree-Algorithm.zip

    Algorithm-Ukkonen-s-Suffix-Tree-Algorithm.zip,ukkonen的后缀树算法,一个用python实现的完整版本,算法是为计算机程序高效、彻底地完成任务而创建的一组详细的准则。

    suffix-tree:后缀树的实现

    后缀树 后缀树的实现。 如何运行: &gt; ghci suffixTree.hs λ graph . SuffixTree.construct $ "cacao" (或您想要的任何其他字符串而不是“ cacao ”) 依赖关系 ( brew install graphviz ) ( cabal install ...

    ukkonen-suffixtree:Ukkonen 后缀树构建算法的 AC 实现,带有测试套件和树打印

    这是 Esko Ukkonen 在线后缀树构建算法的 C 语言基本实现。 它旨在作为一种教学工具,因为我发现有很多关于算法如何真正线性的数学解释,还有很多写得不好且难以遵循的实现。 从任何一个来源都很难确切地确定如何...

    SuffixTree:一种用 Java 实现的 Ukkonen 算法在线和线性时间构造后缀树

    项目 DA2 26/11/2012 选择非紧凑后缀树作为第一个算法。 这是一个后缀树,每个弧上最多有 1 个字符。... 第二种算法依次构建后缀树。 第三种算法是线性构造算法,由 Ukkonen 给出。 对于搜索操作,总是使用递归。

    后缀树构造与应用

    关于后缀树Ukkonen算法的解释,以https://www.oschina.net/translate/ukkonens-suffix-tree-algorithm-in-plain-english网站讲解为基础

    SuffixTree:McCreight后缀树构建算法的实现

    后缀树构造建造运行make 。 跑步: $ ./suffix input.fasta alphabet.txt 输出包含叶子数、内部节点数、节点总数、最长重复序列的长度以及该序列的起始索引。 该软件已获得 MIT 许可。

    【suffixtree】2020年全国大学生软件测试大赛预选赛开发者测试题目下载

    2020年全国大学生软件测试大赛预选赛...本题使用的源码来自github开源代码,包含后缀树算法“suffixtree”相关的一系列数据结构和算法的实现,在安装mooctest插件的eclipse中可以查看自己的行覆盖和分支覆盖以及成绩。

    node-suffix-tree:使用Node.js中的Ukkonen算法的高效后缀树

    后缀树 后缀树对于后缀和子字符串的有效字符串搜索很有用。 它们通常用于基因组的生物信息学中。 一大优势是您可以在线性时间内跨多个字符串搜索相同的后缀。 这是使用Ukkonen算法的优化实现,需要O(n)时间和O(n...

    后缀树代码

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

    全面的算法代码库

    倍增法求解后缀数组(附带Height数组) Suffix-Array-with-Height(Doubling) 使用Tarjan算法求解强连通分量 Tarjan(Strongly-Connected-Components) 数组版的字典树 Trie(Array) 指针版的字典树 Trie(Pointer)

    论文研究-基于非定长系统调用序列的程序行为动态度量方法.pdf

    针对目前程序动态度量研究...采用后缀树结构设计实时特征度量匹配算法(feature matching with updating suffix tree,FMUS),实现了程序运行过程中的实时特征匹配。实验表明,该方法具有较高的准确率和低时间耗费比。

Global site tag (gtag.js) - Google Analytics