后缀数组在哪里优于后缀树?

时间:2011-08-21 07:40:15

标签: data-structures comparison suffix-tree suffix-array

两个密切相关的数据结构是后缀树和后缀数组。从我读过的内容来看,后缀树比后缀数组更快,更强大,更灵活,内存效率更高。但是,在this earlier question,中提到的最高答案之一是后缀数组在实践中被更广泛地使用。我没有任何使用这些结构的经验,但是现在看起来我总是更喜欢后缀数组上的后缀树来解决需要它们提供的功能的问题(例如快速子字符串检查)。

在什么情况下后缀数组比后缀树更可取?

(顺便说一句,虽然这个问题与我所链接的问题有关,但我认为这并不完全重复,因为我只对后缀数组和后缀树的比较感兴趣,让尝试彻底完成如果你不同意,我会理解这个问题是否会被关闭。)

2 个答案:

答案 0 :(得分:3)

引自http://www.youtube.com/watch?v=1DGZxd-PP7U

  

后缀数组和后缀树曾经不同。但是现在   后缀数组只是实现后缀树的一种方式(或者副词   反之亦然)。见:Kim,Kim和Park。线性化后缀树:高效   索引数据结构具有后缀树和后缀的功能   阵列。 Algorithmica,2007。

Kim等人的论文写得很好,可以访问并参考了其他重要论文,例如Abouelhoda等人的论文。

答案 1 :(得分:1)

后缀数组几乎总是可取的,除了:

  • 如果您打算索引少量数据。
  • 如果您正在研究蛋白质匹配或dna突变,并且可以使用极其昂贵的计算机。
  • 如果您必须不惜一切代价使用带通配符的错误搜索。

后缀数组可用于实现后缀树。这意味着后缀树可以是后缀数组和一些额外的数据结构来模拟后缀树功能。

因此:

  • 后缀数组占用的空间更少(更少)
  • 后缀树构建较慢
  • 后缀树更快地进行模式匹配操作
  • 后缀树可以执行更多操作,最好的是与通配符匹配的错误模式(后缀数组也可以进行模式匹配,但不能使用通配符)

如果要索引大量数据,例如超过50兆字节。后缀树使用了太多空间,以至于您的计算机没有足够的RAM来将其保存在中央内存中。因此它开始使用辅助内存,你会看到速度的巨大下降。 (例如,人类dna使用700兆字节,该数据的后缀树“可以”使用40千兆字节 - > *“可以”取决于实现*)

因此,后缀树几乎从未在实践中使用过。在实践中,使用后缀数组,并且小的附加数据结构为其提供了一些额外的功能(从不是完整的后缀树)。

然而他们是不同的。由于速度快,施工速度快,空间使用率低,很多情况下纯后缀阵列更适合模式匹配。