Ukkonen的后缀树算法:程序'test and split'不清楚

时间:2015-04-27 13:42:19

标签: algorithm suffix-tree

ukkonen's on line construction algorithm

我在尝试理解'测试和拆分'程序时遇到了问题,如下所示: 程序test-and-split(s,(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)

我的问题是,第二行究竟是什么意思,如果g'(s,(k',p'))从s开始并且后面跟着t(k'),它怎么仍然是tk-transition of t(k)??

1 个答案:

答案 0 :(得分:1)

可能你已经弄清楚了,你不再需要答案了,但是因为我在尝试理解它时遇到了同样的问题,也许它对未来的其他人有用,我认为这个答案是以下一个。

Ukkonen's on line construction algorithm,第7页,您可以阅读:

  

...
  由两个显式状态 s r 之间的 STrie(T)中的转换路径拼写的字符串 w 是在 STree(T)中表示为广义转换 g'(s,w)= r 。为了节省空间,字符串 w 实际上表示为一对(k,p)指针(左指针 k 和右指针< em> p )到 T ,使 t k 。 。 。 t p = w 。通过这种方式,广义转换形式为 g'(s,(k,p))= r
  存在这样的指针是因为必须有后缀 T i ,以便 T i 的转换路径在 STrie(T)通过 s r 。我们可以选择最小的 i ,让 k p 指向 T i的子串 s r 的转换路径拼写出来。如果 t k = a,转换 g'(s,(k,p))= r 称为 a - 转换。每个 s 每个a∈Σ最多只能有一个 a - 转换。
  ......

这意味着我们正在寻找最小的索引 k p ,以便 t k 。 。 。 T 中的t p = w =&GT;如果 T 中出现多次 w k p 我们总是引用第一个

现在,过程 test-and-split(s,(k,p),t)测试具有规范引用对的状态(s,(k,p) )是端点,即 STrie(T i-1 中的一个状态 t i -transition 。符号 t i 作为输入参数 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&lt; = p 时)。

如果是这样,那么在第2行我们想要找到从 s 开始的转换,该转换以我们在 T 的pos k 中找到的字符开头>(即 t k )。请注意, t k 必须等于 t k' ,但索引 k k'可以是不同的,因为我们始终指向 T 中第一次出现的字符串 w (还要记住,从一个状态可以得到最多一个以字符 t k =&gt;开头的转换,这是正确的,唯一的转换。

然后在第3行,我们检查规范参考对(s,(k,p))引用的状态是否是端点,即它是否有 t -transition 。状态(s,(k,p)) t 之后我们可以从状态 s 到达的那个(隐式或非隐式)对于 -transition (即 t k -transition ,因为 k'= k ) >(p - k)个字符。这解释了 t k'+ p-k + 1 ,其中 +1 用于下一个字符,我们正在检查的字符如果它等于 t (其中 t = t i )。在那种情况下,我们到达了端点,我们返回true。

否则,从第4行开始,我们将转换 g'(s,(k',p'))= s'分开以显式显示状态(s,(k ,p))并返回新的显式状态。