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)??
答案 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))并返回新的显式状态。