Algorithm Ukkonen的后缀树算法:程序“测试和拆分”不清楚

Algorithm Ukkonen的后缀树算法:程序“测试和拆分”不清楚,algorithm,suffix-tree,Algorithm,Suffix Tree,我在试图理解“测试和拆分”过程时遇到了一个问题,如下所示: 程序测试–和–拆分,k、p、t: >1. if k ≤ p then >2. let g'(s,(k',p'))=s' be the tk-transition from s >3. if t=t(k'+p-k+1) then return (true,s) 我的问题是,第二行到底是什么意思,如果它从s开始,然后是tk,而不是tk,那么g's,k',p'怎么可能仍然是tk转换呢?也许你已经弄明白了,你不再需要答案,但

我在试图理解“测试和拆分”过程时遇到了一个问题,如下所示: 程序测试–和–拆分,k、p、t:

>1. if k ≤ p then
>2. let g'(s,(k',p'))=s' be the tk-transition from s
>3. if t=t(k'+p-k+1) then return (true,s)

我的问题是,第二行到底是什么意思,如果它从s开始,然后是tk,而不是tk,那么g's,k',p'怎么可能仍然是tk转换呢?

也许你已经弄明白了,你不再需要答案,但既然我在试图理解它时遇到了同样的问题,也许这对将来的其他人会有用,我想答案如下

在第7页,您可以看到:

。。。 由两个显式状态s和r之间的过渡路径表示的字符串w在街上表示为广义过渡g′,w=r。为了节省空间,字符串w实际上表示为一对指针k,p,左指针k和右指针p到T,这样tk。tp=w。这样,广义变换的形式为g′,k,p=r。 这样的指针之所以存在,是因为必须有一个后缀Ti,使得STrieT中Ti的转换路径通过s和r。我们可以选择最小的i,让k和p指向Ti的子串,它由从s到r的过渡路径表示。如果tk=A,则过渡g′s,k,p=r称为A-过渡。每个a最多只能有一个a–转换∈ Σ. ...

这意味着我们正在寻找最小的指数k和p,这样tk。T中的tp=w =>如果T中出现多个w,则对于k和p,我们总是引用第一个

现在,过程测试-和-拆分,k,p,t测试具有规范引用对s,k,p的状态是否为端点,即STrieT i中的状态−1将进行ti转换。符号ti作为输入参数t给出

算法的第一行如下所示:

   procedure test–and–split(s,(k,p),t):
1.   if k ≤ p then
2.     let g′(s,(k′,p′)) = s′ be the t(k)–transition from s;
3.     if t = t(k′+p−k+1) then return(true,s)
4.     else ...
在第1行,我们检查状态是否是隐式的,即当k时,这是正确的,也是唯一的一个

然后在第3行,我们检查规范引用对s,k,p引用的状态是否是端点,也就是说,它是否有ti-transition。状态s,k,p是一个隐式的或非隐式的,我们可以从状态s到达,在tk'-转换之后,这是tk转换,因为对于p-k字符,k'=k。这就解释了tk′+p−k+1,其中+1表示下一个字符,我们正在检查它是否等于t,其中t=ti。在这种情况下,我们到达端点并返回true


否则,从第4行开始,我们拆分转换g′,k′,p′=s′,使状态s,k,p显式化,并返回新的显式状态

我被困在报纸上完全相同的地方,我很高兴我找到了你的答案@来自状态s的翼龙我们想要读取由一对指针k,p表示的字符串w=tk…tp。从s开始,只能有一个tk转换,意思是以字符tk开头的转换,但如果在T中有另一个字符串w'=tk'…tp',那么w'=w和k'在纸上看起来,可可字符串不构成k'!=k适用于施工过程中的任何sj。你能给出一个具体的例子吗?事实上,我试着用我的python算法实现来构建可可树的后缀树,你可以找到,它使用了k'=函数测试和拆分的3次调用中的k。正如您在我的代码中看到的,我插入了第105-107行来通知k'的使用=k、 寻找最小的索引k和p,使t_k。在你的答案中t_p=w in t。例如,对于字符串aabaac,最后一个STree具有“a”的转换路径,该路径不是从根开始的,而是从r=root,a开始的。这种转换是g'r,2,2=r',而不是本文中的g'r,1,1的1索引符号。在代码中,它是0索引的