【问题标题】:Suffix array nlogn creation后缀数组 nlogn 创建
【发布时间】:2016-07-17 07:48:39
【问题描述】:

我一直在学习suffix arrays的创建,&我明白我们首先按照第一个字符对所有后缀进行排序,然后按照前2个字符,然后是前4个字符,依此类推,而要考虑的字符数较少大于 2n。

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

【问题讨论】:

  • 这和二分查找除半而不是分成三部分是一样的。选择2是因为它更简单。就复杂性而言,两者是相同的。

标签: java algorithm suffix-array suffix


【解决方案1】:

后缀数组构造算法我还没有分析透彻,但还是想分享一下我的想法。

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

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

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

  • 为什么是两性而不是三性?

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

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

【讨论】:

    【解决方案2】:

    答案来自您linked 的帖子。正如@Leon 回答的那样,该算法之所以有效,是因为它使用二分法来解决排序问题。如果您正确阅读答案,主要目的是将单词分成小的2个字符片段。这样4个字符可以很容易地根据2对字符的排列进行排序,6个字符有4-2或2-4或2-2-2等等。因此,表中包含 3 个字母的单词是无意义的,因为可以看到 3 个字符的单词有 2 个字符 + 最后一个字符在字母表中的位置。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2020-08-29
        • 1970-01-01
        • 2020-02-05
        • 2012-06-26
        • 1970-01-01
        • 2011-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多