什么是当前最先进的后缀阵列构造算法?

时间:2011-10-22 05:43:31

标签: suffix-array

我正在寻找一种快速suffix-array构造算法。我对实现的简易性和原始速度比渐近复杂性更感兴趣(我知道后缀数组可以在O(n)时间内通过后缀树构造,但是需要很多空间;显然其他算法都有糟糕的最糟糕的大O复杂性,但在实践中运行得相当快)。我不介意生成LCP阵列作为副产品的算法,因为我无论如何都需要一个用于我自己的目的。

我找到了taxonomy of various suffix array construction algorithms,但它已经过时了。我听说过SA-ISqsufsortBPR,但我真的不知道它们如何相互比较,也没有更好的算法。考虑到后缀阵列字段现在看起来有多热,我希望其他一些算法在发布之后已经取代了那些算法。我好像回忆起一篇描述一种叫做“分裂”的快速算法的论文,但我现在找不到它。

那么,目前最先进的技术是什么?理想情况下,我想要一份当前最佳算法的简短列表(如果可能的话,还有链接),并快速概述它们的相对优势和劣势。

3 个答案:

答案 0 :(得分:42)

目前,Yuta Mori提供的最好的Suffix-Array构造函数是LibDivSufSort: http://code.google.com/p/libdivsufsort/

它使用诱导排序方法(基本上,在排序所有以“A *”开头的字符串后,您可以引出字符串“BA *”“CA *”“DA *”等的排序。)

它因其效率和对退化病例的良好处理而无处不在。它也是最快的,并使用最佳内存量(5N)。许可证是不显眼的,因此该算法被集成到其他几个程序中,例如Ilya Grebnov的libbsc压缩库。 http://libbsc.com/default.aspx

为了便于比较,您将在此页面找到链接的后缀阵列压缩基准测试: http://code.google.com/p/libdivsufsort/wiki/SACA_Benchmarks 和这个页面 http://homepage3.nifty.com/wpage/benchmark/index.html

基准测试还列出了许多其他有价值的SACA实施。 然而,出于许可和效率原因,我建议其中包括libdivsufsort。

编辑:显然,据说MSufsort即将推向版本4,并且应该比Divsufsort快得多。如果这是对的,它将成为新的SACA冠军。但是,我们还没有发布日期,这将是alpha内容。因此,如果您现在需要经过验证的实现,libdivsufsort仍然是最佳选择。

另请注意,这些“最佳SACA实现”并未使用“一种构造算法”,而是结合了多种优化技巧,这使得难以总结。

答案 1 :(得分:10)

http://code.google.com/p/libdivsufsort/source/browse/wiki/SACA_Benchmarks.wiki提供了您想要的最快算法列表。

在上述基准测试中,kvark的实施是大多数情况下最快的。您可以在http://www.kvatom.com/archon上找到代码。

libdivsufsort是IT算法和Induced Sorting后期处理的组合。选择后缀的子集就像诱导排序算法一样,但不是通过诱导排序递归求解,而是按IT的算法进行排序。

libdivsufsort和kvark的实现都基于IT的算法。

KA的算法类似于IT的算法,它出现在99.它们都将后缀分为两类:S型或L型。如果第i个后缀小于第(i + 1)个后缀,它是S型;否则它是类型L.在对所有类型S后缀进行排序后,我们可以推导出所有类型L后缀的顺序,然后我们就完成了。

KA算法与IT算法的区别在于:KA使用递归对子字符串进行排序,而IT的算法则采用Multikey Quicksort / MSD /插入排序。

答案 2 :(得分:2)

你可以看一下:

快速浏览后缀数组和压缩后缀数组 R Grossi - 理论计算机科学,2011

可能新的后缀数组算法不再以您想象的速度开发。为了处于最前沿,我建议查看与后缀数组一起使用的数据结构,并查看关于后缀数组相关数学的论文:Schürmann,Munro,He等