我正在从codechef和stackoverflow中读取后缀数组构造教程。我能理解的一点是他们说..
首先对原始字符串S的2克(*),然后是4克,然后是8克等进行排序,因此在第i次迭代中,我们对2i进行排序-grams
等等。每次迭代我都有两个步骤:
使用上一次迭代中的词典名称排序2i-gram,以便在两个步骤(即O(1)时间)中进行比较
创建新的词典名称
我的怀疑是: 如何使用2克计算的指数4克。 ?
假设我的2个后缀是'ab','ac'你怎么能比较O(1)时间并给它们索引。
我真的尝试但坚持到那里。请提供一些例子,这有帮助。比 ks提前
答案 0 :(得分:2)
假设所有长度为2^k
的子字符串都已排序,现在我们要对长度为2^(k + 1)
的所有子字符串进行排序。这里的关键观察是,任何长度为2^(k + 1)
的子字符串都是两个长度为2^k
的子字符串的串联。
例如,在字符串abacaba
中,子字符串caba
是ca
和ba
的串联。
但是所有长度为2^k
的子字符串都是排序的,因此我们可以假设它们中的每一个都根据它在排序中的位置分配了范围[0 ... n - 1]
(我将称之为类)的整数。具有此长度的所有子串的数组(当然,相等的字符串应分配相同的数字,并且此数组不会显式维护)。在这种情况下,长度为2^(k + 1)
的每个子字符串可以分别表示为一对两个数字(p1, p2)
- 第一个和第二个子字符串的类。所以我们需要做的就是从范围[0 ... n - 1]
中对一组整数进行排序。可以使用基数排序在线性时间内完成。在对这些对进行排序之后,我们可以在排序数组中使用单个遍来查找长度为2^(k + 1)
的所有子字符串的类。