String 理解DC3/Skew算法的实现以创建后缀数组线性时间

String 理解DC3/Skew算法的实现以创建后缀数组线性时间,string,algorithm,full-text-search,suffix-array,String,Algorithm,Full Text Search,Suffix Array,我试图理解Karkkainen,p.Sanders的线性时间后缀数组创建算法的实现。可以找到算法的详细信息 我设法理解了整个概念,但未能将其与提供的实现相匹配,因此无法清楚地把握它 以下是让我困惑的初始代码路径 根据论文:n0,n1,n2表示从i模3开始的三联体数量=(0,1,2) 根据代码:n0=(n+2)/3,n1=(n+1)/3,n2=n/3;=>这些初始化是如何派生的 根据论文:我们需要创建T',它是在i mod 3处三元组的串联!=0 按代码:n02=n0+n2;s12=[n02]==

我试图理解Karkkainen,p.Sanders的线性时间后缀数组创建算法的实现。可以找到算法的详细信息

我设法理解了整个概念,但未能将其与提供的实现相匹配,因此无法清楚地把握它

以下是让我困惑的初始代码路径

根据论文:n0,n1,n2表示从i模3开始的三联体数量=(0,1,2)

根据代码:n0=(n+2)/3,n1=(n+1)/3,n2=n/3;=>这些初始化是如何派生的

根据论文:我们需要创建T',它是在i mod 3处三元组的串联!=0

按代码:n02=n0+n2;s12=[n02]==>n02是怎么来的?它应该是n12,即n1+n2

按照代码:对于(int i=0,j=0;i 为什么for循环运行n+(n0-n1)次?它应该是简单的n1+n2。不应该吗


由于以下原因,我无法继续:(请提供帮助。

考虑以下输入长度为n=13的示例:

 STA | CKO | WER | FLO | W
根据代码:n0=(n+2)/3,n1=(n+1)/3,n2=n/3;=>这些初始化是如何推导出来的

请注意,如果n mod3=0,则三元组i mod3=0的数量为n/3,否则为n/3+1(如果n mod3=1或n mod3=2)。在当前示例中,n/3=4,但由于最后一个三元组“W”不完整,因此不计入整数除法。直接进行此计算的“技巧”是使用(n+2)/3.实际上,如果n mod3=0,则整数除法(n+2)/3和n/3的结果将是相同的。然而,如果n mod3=1或2,则(n+2)/3的结果将是n/3+1。这同样适用于n1和n2

根据代码:n02=n0+n2;s12=[n02]==>n02是怎么来的?它应该是n12,即n1+n2。 按照代码:for(int i=0,j=0;i为什么for循环运行n+(n0-n1)次?应该是简单的n1+n2。不应该是吗

两个问题的答案相同。在我们的示例中,我们有一个B12缓冲区,如下所示:

B12 = B1 U B2 = {TA KO ER LO}
因此,首先对后缀进行排序,最后得到一个包含8个元素的B12后缀数组。要继续合并步骤,我们首先需要计算B0的后缀数组,它是通过对元组(B0(i),秩(i+1))进行排序得到的……但最后一个三元组只有一个元素(W)的具体情况存在问题,因为秩(i+1)未为B0的最后一个元素定义:

B0 = {0,3,6,9,12}
按字母顺序排序的结果是

SA0 = {3, 9, 0, ?, ?}
由于索引6和12包含一个“W”,仅按字母顺序排序是不够的,我们需要检查排名表中哪个在前,所以让我们检查它们后缀的排名……哦,等等!排名(13)没有定义

这就是为什么当最后一个三元组只包含一个元素(如果nmod3=0)时,我们在输入的最后一个三元组中添加一个伪0。那么B12的大小是n0+n2,不管n1的大小如何,如果B0大于B1(在这种情况下n0-n1=1),我们需要向B12添加一个额外的元素


希望它是清楚的。

我知道这是一个旧的答案,但是你能帮助我理解后缀数组文件中的原始代码吗?我已经给了将近3天的时间。我相信我理解了这个概念,但我仍然无法正确理解代码。你能帮我完成第二步吗?@Naman如果你愿意,我很乐意帮助你指定论文标题和算法中的具体步骤/行。感谢我们的帮助。事实上,经过很多努力,我几乎可以理解所有内容。