【问题标题】:building Suffix array in O(n logn)在 O(n logn) 中构建后缀数组
【发布时间】:2014-09-16 03:06:03
【问题描述】:

我也在阅读来自 codechef 和 stackoverflow 的后缀数组构造教程。我能理解的一点是他们说..

它的工作原理是首先对原始字符串 S 的 2-gram(*)、4-gram、8-gram 等进行排序,因此在第 i 次迭代中,我们对 2i 进行排序-克

等等。每次迭代 i 有两个步骤:

按 2i-gram 排序,使用上一次迭代中的字典名称,以便在 2 个步骤(即 O(1) 时间)中进行比较

创建新的词典名称

我的疑问是: 如何使用以 2 克计算的索引为 4 克。 ?

假设我的 2 个后缀是“ab”、“ac”,那么您如何在 O(1) 时间内进行比较并为它们提供索引。

我真的尝试过但卡在那里。请提供一些示例,这会有所帮助。比 提前了解

【问题讨论】:

    标签: data-structures suffix-array


    【解决方案1】:

    假设所有长度为2^k 的子字符串都已排序,现在我们要对所有长度为2^(k + 1) 的子字符串进行排序。这里的关键观察是任何长度为2^(k + 1) 的子字符串都是两个长度为2^k 的子字符串的串联。
    例如,在字符串abacaba 中,子字符串cabacaba 的串联。
    但是所有长度为2^k 的子字符串都已排序,因此我们可以假设它们中的每一个都被分配了一个范围[0 ... n - 1](我将称之为类)的整数,基于它在所有具有此长度的子字符串的排序数组中的位置(相等的字符串应该分配相等的数字,当然,这个数组没有明确维护)。在这种情况下,每个长度为2^(k + 1) 的子字符串可以表示为一对两个数字(p1, p2) - 分别属于第一个子字符串和第二个子字符串。所以我们需要做的就是从[0 ... n - 1] 范围内对整数对数组进行排序。可以使用基数排序在线性时间内完成。对这些对进行排序后,我们可以在排序后的数组中使用单次遍历找到所有长度为 2^(k + 1) 的子字符串的类。

    【讨论】:

      猜你喜欢
      • 2012-11-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2011-10-22
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多