我将介绍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页)

最佳答案

基数排序后,sa12[]中的相邻元素可能相等,因此循环中有一个if,对于r1和r2,给出一个示例:
原始数组为[y a b b a d a 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的浓度。
希望这有帮助。

10-07 17:57