【发布时间】:2012-06-26 23:40:22
【问题描述】:
我只是想知道,什么时候后缀树优于增强后缀数组。
阅读Replacing suffix trees with enhanced suffix arrays 后,我看不到使用后缀树的理由了。有些方法可能会变得复杂,但您可以使用后缀数组完成所有操作,就像使用后缀树可以完成的操作一样,您需要相同的时间复杂度但内存更少。
survey 甚至表明,后缀数组更快,因为它们对缓存更友好,并且不会产生那么多缓存未命中,然后是后缀树(因此缓存可以更好地预测数组使用情况,然后在递归树结构)。
那么,有谁知道选择后缀树而不是后缀数组的原因?
编辑 好的,如果您知道更多,请告诉我,到目前为止:
- 后缀数组不允许在线构造
- 一些模式匹配算法在后缀树上运行得更快
- (新增)由于在线构建,可以将其保存在hd a上并放大现有的后缀树。如果您使用 SSD,它也应该很快安静。
【问题讨论】:
-
只是猜测,但在实际实现中,后缀树的内存可能会更小。
-
@Justin:不,实际上增强后缀数组消耗的内存更少,这就是链接论文的全部内容
-
嗯,我不知道。如果我将 Ukkonen 的后缀树构造与线性时间后缀数组构造进行比较,则 imo 并不容易。如果您只看最简单的结构,那么对后缀列表进行排序然后将它们排列在树中会更容易理解,还是?
-
可能是因为增强后缀数组的复杂性?我们都是人类,如果需要阅读 35 页的密集文档,许多程序员都懒得学习新算法。我只是在反思自己,因为我只是花了很多时间研究后缀树,犯了一个错误并实现了错误的数据结构,终于理解了 Ukkonen 的算法(我希望)......然后我打开了增强后缀数组论文和意识到我需要学习多少才能实现它(可能超过一天的阅读/学习/编码 - 不包括我之前的研究)
标签: algorithm time-complexity suffix-tree space-complexity suffix-array