后缀树的应用

本文介绍了后缀树在解决字符串匹配和求解最长公共子串问题中的应用。通过构建后缀树,可以高效地查询模式串在文本串中的出现位置,实现时间复杂度为O(n+k)。对于最长公共子串问题,后缀树可以在O(n+m)的时间复杂度内完成,优于朴素动态规划。通过广义后缀树和节点标记,找到同时标记两种字符串的最长路径,达到优化目的。
摘要由CSDN通过智能技术生成
    ——————《高级数据结构》
    在这一节中,我们将给出几个常见的后缀树的应用,并且你将会看到它与其他处理字符串的算法与数据结构(例如KMP算法,AC自动机等)之间的比较。后缀树是一个非常强大的处理字符串问题的工具,并且企图在这一节短篇幅里面穷尽其应用是不可能的。因此,这里的介绍旨在抛砖引玉,更多的应用可以参考相关的书籍以及该领域的最新研究成果。
   字符串的精确匹配

情形一:
给定两个串S和T,分别代表模式串和文本串,长度分别为n和m,现在需要在串T中查找串P的每一个出现的位置。
了解KMP算法的读者一定对这个问题非常熟悉——这正是KMP算法应用的经典场景。在比较两者之前我们先看一下后缀树的算法实现。。
后缀树实现:首先构建串T的后缀树,所用时间复杂度为O(m),然后我们只需要在后缀树中查找串S即可。如果串S没有出现在后缀树中,那么显然串T不包含串S;如果串S结束于后缀树的某个节点v(结束于某一条边内的情形也类似),那么节点v的路径标记在T中出现的每个位置都匹配串S。为了知道所有出现的位置,我们只需要遍历v的子树,找到所有叶节点,便可以知道所有对应位置出现的位置了。当然,我们还有优化的余地——如果我们能够较快的找到v的字数中所有叶节点的话,就能够将查询降到O(n+k),其中k为S在T中出现的次数,也就是节点v子树中叶节点的个数,这正是一个于KMP一样优秀的时间复杂度。实现方式也很简单,将叶节点按照便利顺序额外用链表依次连接,每个内部节点只需标记叶节点的范围即可(肯定是连续的一段)。
伪代码:
Function FindMatches(S)
{
v<-Fin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值