后缀数组与后缀树

Posted

技术标签:

【中文标题】后缀数组与后缀树【英文标题】:Suffix Arrays vs Suffix Trees 【发布时间】:2012-06-26 23:40:22 【问题描述】:

我只是想知道,什么时候后缀树优于增强后缀数组。

阅读Replacing suffix trees with enhanced suffix arrays 后,我看不到使用后缀树的理由了。有些方法可能会变得复杂,但您可以使用后缀数组完成所有操作,就像使用后缀树可以完成的操作一样,您需要相同的时间复杂度但内存更少。

survey 甚至表明,后缀数组更快,因为它们对缓存更友好,并且不会产生那么多缓存未命中,然后是后缀树(因此缓存可以更好地预测数组使用情况,然后在递归树结构)。

那么,有谁知道选择后缀树而不是后缀数组的原因?

编辑 好的,如果您知道更多,请告诉我,到目前为止:

后缀数组不允许在线构造 一些模式匹配算法在后缀树上运行得更快 (新增)由于在线构建,可以将其保存在hd a上并放大现有的后缀树。如果您使用 SSD,它也应该很快安静。

【问题讨论】:

只是猜测,但在实际实现中,后缀树的内存可能会更小。 @Justin:不,实际上增强后缀数组消耗的内存更少,这就是链接论文的全部内容 嗯,我不知道。如果我将 Ukkonen 的后缀树构造与线性时间后缀数组构造进行比较,则 imo 并不容易。如果您只看最简单的结构,那么对后缀列表进行排序然后将它们排列在树中会更容易理解,还是? 可能是因为增强后缀数组的复杂性?我们都是人类,如果需要阅读 35 页的密集文档,许多程序员都懒得学习新算法。我只是在反思自己,因为我只是花了很多时间研究后缀树,犯了一个错误并实现了错误的数据结构,终于理解了 Ukkonen 的算法(我希望)......然后我打开了增强后缀数组论文和意识到我需要学习多少才能实现它(可能超过一天的阅读/学习/编码 - 不包括我之前的研究) 【参考方案1】:

在 SO 本身中有一些关于该主题的 interesting thoughts。您还可以在线找到more technical material。 another paper 可以帮助您解决问题,声称是实现这些结构的另一种有效方法。

我不是这个问题的专家,但在我看来,后缀数组可能会慢一些,尽管它们更节省空间。尽管如此,我缺乏实践经验来更详细地了解它们。

【讨论】:

【参考方案2】:

另一个证明后缀树优越的例子:

如果你已经有一个后缀树,你可以很容易地构造一个后缀数组。

但是从后缀数组构造后缀树要复杂得多。

【讨论】:

以上是关于后缀数组与后缀树的主要内容,如果未能解决你的问题,请参考以下文章

字符串-后缀树和后缀数组详解

Trie vs. 后缀树 vs. 后缀数组

使用后缀自动机求后缀数组

BZOJ 1396: 识别子串( 后缀数组 + 线段树 )

[SDOI2016] 生成魔咒 - 后缀数组,平衡树,STL,时间倒流

整理如何选取后缀数组&&后缀自动机