我正在讨论用于构造后缀数组的线性时间算法DC3算法。我无法理解论文中的技术found here。
我无法理解本文第6页提到的重命名是如何完成的。如何按照步骤1完成重命名。附录中相关的代码部分是:
for (int i = 0; i < n02; i++)
{
if (T[SA12[i]] != c0 || T[SA12[i]+1] != c1 || T[SA12[i]+2] != c2)
{
name++; c0 = T[SA12[i]]; c1 = T[SA12[i]+1]; c2 = T[SA12[i]+2];
}
if (SA12[i] % 3 == 1)
{
R[SA12[i]/3] = name;
} // write to R1
else
{
R[SA12[i]/3 + n0] = name;
} // write to R2
}
请帮我理解这一部分。 (此代码来自pdf的第20页)
答案 0 :(得分:1)
DC3 算法在 C++ 中可用,位于 DC3 Algorithm。存储库目前没有教程文档,但可能很快就会提供。
答案 1 :(得分:0)
在基数排序之后,SA12 []中的相邻元素可能相等,所以在循环中有一个if,对于R1和R2,给出一个例子:
原始数组为[y a b b a d a b b a d o],n = 12,索引范围为[0,11] R1 = [1,4,7,10] R2 = [2,5,8,11],“if(SA12 [i]%3 == 1)”表示SA12 [i]属于R1,否则属于R2 ,R是R1和R2的浓度。
希望这会有所帮助。