可能您已经想通了,不再需要答案,但是由于我在尝试理解它时遇到了同样的问题,并且将来可能对其他人有用,所以我认为答案是下面那个。
在Ukkonen's on line construction algorithm,在第 7 页你可以读到:
...
STrie(T) 中两个显式状态 s 和 r 之间的转换路径拼出的字符串 w 是在 STree(T) 中表示为广义转换 g′(s,w) = r。为了节省空间,字符串 w 实际上表示为一对 (k,p) 指针(左指针 k 和右指针 p) 到 T 使得 tk 。 . . tp = w。通过这种方式,广义转换得到形式 g′(s, (k, p)) = r。
存在这样的指针是因为必须有一个后缀 Ti 使得 Ti 的转换路径在 STrie(T) 通过 s 和 r。我们可以选择最小的这样的i,让k和p指向这个Ti的子串sub> 由 s 到 r 的转换路径拼写出来。一个转移g′(s, (k, p)) = r被称为一个a——转移如果tk = a 。对于每个 a ∈ Σ,每个 s 最多可以有一个 a–transition。
...
这意味着我们正在寻找最小的索引 k 和 p 使得 tk 。 . . tp = w in T
=> 如果在 T 中出现不止一次 w,对于 k 和 p,我们总是引用第一个。
现在,过程 test–and–split(s,(k,p),t) 测试一个状态是否具有规范参考对 (s,(k,p) ) 是端点,即在 STrie(T i−1) 中会有一个 ti sub>——过渡。符号 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 时)。
如果是这样,那么在第 2 行,我们希望找到从 s 开始的过渡,该过渡以我们在 T的 pos k 中找到的字符开始>(即tk)。注意 tk 必须等于 tk' 但索引 k 和k' 可以不同,因为我们总是指向字符串 w 在 T 中的第一次出现(还要记住,从一个状态可以有最多一个以字符 tk => 开头的转换,所以这是正确的,也是唯一的)。
然后在第 3 行,我们检查规范引用对 (s,(k,p)) 引用的状态是否是端点,即它是否有一个 ti - 过渡。状态 (s,(k,p)) 是我们可以从状态 s 到达的状态(隐式或非隐式),遵循 t k' -transition(即 tk-transition 因为 k' = k)对于 (p - k) 个字符。这解释了 tk′+p−k+1,其中 +1 用于下一个字符,即我们正在检查的字符如果它等于 t(其中 t = ti)。在那种情况下,我们到达了端点并且我们返回 true。
否则,从第 4 行开始,我们拆分转换 g′(s,(k′,p′)) = s′ 以明确状态 (s,(k ,p)) 并返回新的显式状态。