后缀数组nlogn创建

时间:2016-07-17 07:48:40

标签: java algorithm suffix-array suffix

我一直在学习suffix arrays创作,&据我所知,我们首先根据第一个字符对所有后缀进行排序,然后根据前2个字符,然后是前4个字符,依此类推,同时要考虑的字符数小于2n。

但我怀疑的是为什么我们不选择前3个字符,然后选择9个...依此类推。为什么只考虑2个字符,因为字符串是相同字符串的一部分而不是不同的随机字符串?

3 个答案:

答案 0 :(得分:5)

我没有彻底分析后缀数组构造算法,但仍想分享我的想法。

以我的拙见,你的问题类似于以下问题:

  • 为什么计算机使用信息的二进制编码而不是三元?

  • 为什么二元搜索会将范围二等分而不是三分?

  • 为什么有两个性别而不是三个?

原因是数字2是特殊的 - 它是最小的复数。 1和2之间的差异是定性的,而2和3之间的差异(以及任何其他正整数)是定量的,因此不是那么激烈。

因此,许多算法和数据结构的二进制公式被证明是最简单的一种,尽管它们中的一些可能被推广,具有不同程度的增加的复杂性,用于任意基础。

答案 1 :(得分:2)

通过帖子linked给出答案。正如@Leon回答的那样,该算法可行,因为它使用二分法来解决排序问题。如果你正确地阅读了答案,主要目的是将词分成小的2个字符片段。因此,4个字符可以根据2对字符的排列,6个字符,4-2或2-4或2-2-2等轻松排序。因此,表中有3个字母的单词是无意义的,因为可以看到3个字符的单词有2个字符+最后一个字符的字母表中的位置。

答案 2 :(得分:2)

我认为你只考虑2^x3^x的速度,你显然更喜欢后者。 但是你必须考虑每一步所需的努力。 由于3^x所需的步数比2^x少1.58,因此您需要能够为3^x增长计算单个步骤,而不是单步执行步骤的1.58倍。 2^x增长表现更好。 通常,当您必须在每个步骤中处理三个元素而不是两个元素时,问题将变得更加复杂。 此外,如果您可以将其扩展为3^x,那么您也可以将其扩展为更大的n^x,然后使用大n,您的算法突然不是指数的,而是有效的线性。