后缀阵列DC3算法

时间:2013-09-03 18:41:32

标签: algorithm suffix-array

我正在讨论用于构造后缀数组的线性时间算法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页)

2 个答案:

答案 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的浓度。

希望这会有所帮助。