前面两篇转载的后缀树系列文章已经描述了后缀树的线性构建算法。创建后缀树的O(n)算法,除了1995年E. Ukkonen大幅简化的算法,还有Peter Weiner的73年年度最佳算法、Edward McCreight1976的改进算法、Juha Kärkkäinen 和 Peter Sanders2003年进一步简化的线性算法,可以根据自己喜好选择。
转载的本系列文章应该预设有第三篇的(后缀树应用),但是没找到,那就自己总结一下吧。
先扩展一下后缀树的概念:广义后缀树(Generalized Suffix Tree)。传统的后缀树处理一坨单词的所有后缀。广义后缀树存储任意多个单词的所有后缀。注意我们需要区分不同单词的后缀,所以叶节点用不同的特殊符号与后缀位置配对。

主要应用场景

1. 查找字符串 Pattern 是否在于字符串 Text 中(生信中的exact string matching)

解决方案:用 Text 构造后缀树,按在 Trie 中搜索字串的方法搜索 Pattern 即可。若 Pattern 在 Text 中,则 Pattern 必然是 Text 的某个后缀的前缀。 采用后缀树的方法,其总的计算复杂度并不劣于KMP等经典方法,可以作为重要的替代方法。此外更重要应用场景如下: Exact set matching problem(多个子串的情况); The substring problem for database of patterns(多个母串的情况)。

2. 计算指定字符串 Pattern 在字符串 Text 中的出现次数

解决方案:用 Text+`$` 构造后缀树,搜索 Pattern 所在节点下的叶节点数目即为重复次数。如果 Pattern 在 Text 中重复了 c 次,则 Text 应有 c 个后缀以 Pattern 为前缀。

3. 查找字符串 Text 中的最长重复子串

解决方案:用 Text+`$` 构造后缀树,搜索 后缀树中最深的非叶节点。从 root 到该节点所经历过的字符串就是最长重复子串。

4. 查找两个字符串 Text1 和 Text2 的最长公共部分(即Lowest Common Ancestor)

解决方案:连接 Text1+`#` + Text2+`$` 形成新的字符串并构造后缀树,找到最深的非叶节点,且该节点的叶节点既有 `#` 也有 `$`。 另外,这个可以从两个推广到多个字符串。 查找LCA的算法是O(1)的复杂度,代价是需要对后缀树做复杂度为O(n)的预处理。 曾记得以前学过树结构的LCA各种算法,比如Tarjan算法(DFS+并查集,离线)、RMQ(时间戳,在线)、树链剖分等,年代久远,这些东西都记不清楚了T_T。 此外,还有一种二进制树检索LCA的方法,用二进制的每一位表示路径方向,0表示左儿子,1表示右儿子。只需将需要比较的两个节点的二进制值进行XOR计算,即可得知二者重叠的路径(根据XOR的定义知,左边连续的0右多少个,则有多少重叠)。将任意后缀树mapping到二进制树中,即可快速地检索出LCA。(关于二进制树,具体请参考*Algorithms on Strings, Trees and Sequences* 一书)

5. 查找给定字符串 Text 里的最长回文(palindrome in DNA or RNA)

解决方案:将 Text 整体反转形成新的字符串 Text2,例如 "abcdefgfed" => "defgfedcba"。连接 Text+`#` + Text2+`$` 形成新的字符串并构造后缀树,然后将问题转变为查找 Text 和 Text1 的最长公共部分。 注意,DNA或RNA中回文的定义略有区别。

6. 识别DNA污染问题

定义:给定一个新测序的DNA序列S1和一个来自可能的污染物的DNA序列S2, 发现S2中所有出现在S1中且长度超过给定阈值x的子串,如果S2中的某个子串出现在S1中, S1可能已经被污染了。 解决方案:本质上是LCA问题的变种。

7. All-pairs suffix-prefix matching

定义:给定字符串Si和Sj,若Si的后缀与Sj的前缀匹配,则称suffix-prefix match。如果将两个字符串的问题,推广到多个字符串S1,S2,S3...Sk的情况,对于任意其中两个Si和Sj进行suffix-prefix match,其中最长的suffix-prefix match称为All-pairs suffix-prefix matching。 解决方案:可以在线性时间内解决,本人暂时未仔细阅读这个方法,请参考*Algorithms on Strings, Trees and Sequences* 一书。

8. Circular string linearization

定义:字符串S中的任意一个位置切断,而原先的首位相接,可以得到新的字符串。如何选择这个位置,使得新字符串的字典序最小。 解决方案:给定长度为n的字符串S,先复制成2倍长度变成SS,构建SS+`$` 的后缀树T,从T的根节点开始,每次顺着字典序最小的分支走下去,直至深度为n,得到的字符串对应的切割方案即为所求。

9. Suffix trees in genome-scale projects

一些基因工程里已经应用了后缀树的方法,比如Arabidopsis thaliana(拟南芥)、Yeast(酵母)、Borrelia burgdorferi(博氏疏螺旋体)等

其他应用场景

1. Longest common extension; 2. Finding all maximal palindrome in linear time; 3. Exact matching with wild cards(通配符); 4. The k-mismatch problem; 5. Approximate palindrome and repeats; 6. Faster methods for tandem repeats; 7. A linear-time solution to the multiple common substring problem.

空间优化

构建Directed Acyclic Word Graph,简称DAWG。具体请查看相关资料(比如*Algorithms on Strings, Trees and Sequences* 一书中就有章节讲述:Building a smaller directed graph for exact matching)。 *Algorithms on Strings, Trees and Sequences* 一书中还有几个空间优化的例子: A reverse role for suffix trees, and major space reduction; Space-efficient longest common substring algorithm; Suffix arrays——more space reduction.

其他

*Algorithms on Strings, Trees and Sequences* 一书中还提到了一些相关的知识。 1. Boyer-Moore如何解决exact set matching problem; 2. Ziv-Lempel 数据压缩; 3. Minimum length encoding of DNA.

推荐的参考资料

关于后缀树的讲解,还有一些不错的文章: 1. 后缀树 (该作者不允许转载。。) 2. 祥林嫂精神恍惚痛苦呼唤之关于Suffix Tree[后缀树] (图文可见 此博客 )

其他参考资料:

  • Pattern Searching | Set 8 (Suffix Tree Introduction)
  • 后缀树的构造方法-Ukkonen详解
  • Ukkonen’s Suffix Tree Construction – Part 1
  • Suffix Trees
  • Compressed Trie
  • Pattern Searching using a Trie of all Suffixes
  • Algorithms on Strings, Trees, and Sequences
  • C# Suffix tree implementation based on Ukkonen's algorithm
  • Ukkonen's suffix tree algorithm in plain English?
  • Ukkonen 的后缀树算法的清晰解释
  • Fast String Searching With Suffix Trees
  • Esko Ukkonen's Paper: On–line construction of suffix trees
  • Graphviz - Graph Visualization Software
  • a suffix tree algorithm for .NET written in C#

后缀树系列三:后缀树的应用相关推荐

  1. 超级详细树讲解三 —— B树、B+树图解+代码

    首先很高兴你看到了这篇文章,这篇文章可能会花费你很长很长的时间去看,但是这篇文章包括的内容绝对足够你对树的一个系统性的学习.为什么要写这篇文字呢?因为自己在学习树的时候,有些博客只有图解,有些博客只有 ...

  2. 【技术点】数据结构--B树系列之B+树(五)

    文章目录 前言 B+树的结构 Key & Data 叶子节点保存数据:减少I/O的设计 中间节点的索引作用 链表的作用:范围查询 B+树的操作 插入 删除 B+树总结 B*树 总结 前言 前面 ...

  3. 模板 - 树上问题(树的直径、动态查询树的直径、树的重心)

    整理的算法模板合集: ACM模板 目录 一.树的直径 树形DP 两次DFS / BFS(找到直径的两个端点) 二.动态修改树的边权并求每个时刻的直径(线段树) 三.树的重心 一.树的直径 树的直径满足 ...

  4. 后缀树系列一:概念以及实现原理( the Ukkonen algorithm)

    首先说明一下后缀树系列一共会有三篇文章,本文先介绍基本概念以及如何线性时间内构件后缀树,第二篇文章会详细介绍怎么实现后缀树(包含实现代码),第三篇会着重谈一谈后缀树的应用. 本文分为三个部分, 首先介 ...

  5. 数据结构系列——Java后缀树实现代码

    上一篇文章介绍了什么是后缀树以及后缀树的应用场景,同时结合Ukkonen算法论文细述了如何在O(n)时间内构建一颗后缀树,这一篇详细介绍如何使用Java实现的Ukkonen后缀树构建算法.完整代码看这 ...

  6. 看动画学算法系列之:后缀树suffix tree

    文章目录 简介 字典树Trie 压缩字典树 后缀树Suffix Tree 后缀树的搜索 查找最长重复子字符串 查找两个字符串的最长公共子字符串 后缀树的代码实现 简介 模式匹配是一个在工作中经常会用到 ...

  7. 012-数据结构-树形结构-哈希树[hashtree]、字典树[trietree]、后缀树

    一.哈希树概述 1.1..其他树背景 二叉排序树,平衡二叉树,红黑树等二叉排序树.在大数据量时树高很深,我们不断向下找寻值时会比较很多次.二叉排序树自身是有顺序结构的,每个结点除最小结点和最大结点外都 ...

  8. 从Trie树(字典树)和后缀树

    从Trie树(字典树)谈到后缀树 转载:http://blog.csdn.net/v_july_v/article/details/6897097#t22 感谢作者,侵删. 引言 常关注本blog的读 ...

  9. 树链剖分 + 后缀数组 - E. Misha and LCP on Tree

    E. Misha and LCP on Tree Problem's Link Mean: 给出一棵树,每个结点上有一个字母.每个询问给出两个路径,问这两个路径的串的最长公共前缀. analyse: ...

  10. [BJWC2018]Border 的四种求法(后缀自动机+链分治+线段树合并)

    题目描述 给一个小写字母字符串 S ,q 次询问每次给出 l,r ,求 s[l..r] 的 Border . Border: 对于给定的串 s ,最大的 i 使得 s[1..i] = s[|s|-i+ ...

最新文章

  1. 前后端分离开发,RESTful 接口应该这样设计
  2. 怎么计算一个对象占用的内存
  3. 神经网络模型中class的forward函数何时调用_用Keras从零开始6步骤训练神经网络
  4. 杰和弯道超车 推企业级NAS存储应用方案
  5. linux 软件包管理设置,Linux速通08 网络原理及基础设置、软件包管理
  6. JavaWeb --第四章Maven详解
  7. 842. Split Array into Fibonacci Sequence
  8. Elastic全球用户大会Elastic{ON}首次落地北京
  9. 【JEECG技术博文】JEECG国际化介绍
  10. java核心技术 pdf下载_JAVA程序员面试秘笈 PDF 下载_Java知识分享网
  11. android 迅雷 好用版本,迅雷不限速版本安卓下载-迅雷不限速版 安卓版v6.6.6-PC6安卓网...
  12. Linux的vi命令使用详解
  13. android11系统原生铃声,原生系统的凤毛麟角 索尼Xperia 1 II推送Android 11体验
  14. bitcoin全节点搭建
  15. 设计模式(创建型模式)-抽象工厂模式
  16. 想做抖音手工号,没有思路创意怎么办?分析大V总结经验
  17. Arduino实验——EMW3080实现WiFi连接
  18. 报错:CMake Error at /usr/share/cmake-3.10/Modules/CMakeDetermineCCompiler.cmake:48 (message):
  19. 大众碰到点评的一个字体反爬,落地技术也是绝了
  20. 爬虫入门(三)——动态网页爬取:爬取pexel上的图片

热门文章

  1. 斐讯K2 新版固件刷机教程
  2. 文献--A Survey on Server-side Approaches to Securing Web Applications
  3. python在线问卷调查系统_GitHub - imze/surveySystem: 问卷调查系统
  4. CSS 加粗(css font-weight)
  5. 一招解决origin8 licience过期
  6. smb协议讲解_SMB/CIFS协议解析(一)
  7. 容联七陌×惠州燃气丨用服务之光,点燃美好生活
  8. 苹果手机怎么投屏不了,苹果手机怎么投屏电脑
  9. Vue常用组件库集合---kalrry
  10. 教务管理系统数据字典mysql_数据库大作业_-教务管理系统