3

我正在讨论 DC3 算法,即用于构建后缀数组的线性时间算法。我无法理解本文中可以找到的技术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页)

4

2 回答 2

2

DC3 算法在 C++ 中可用,位于DC3 Algorithm。Repository 目前没有教程文档,但可能很快就会提供。

于 2021-02-15T14:24:48.477 回答
0

基数排序后,SA12[]中的相邻元素可能相等,所以循环中有一个if,对于R1和R2,举个例子:

原始数组是[yabbadabbado],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的集中度。

希望这可以帮助。

于 2013-12-23T09:28:14.633 回答