【问题标题】:Ukkonen's suffix tree algorithm: procedure 'test and split' unclearUkkonen 的后缀树算法:程序“测试和拆分”不清楚
【发布时间】:2015-04-27 13:42:18
【问题描述】:

ukkonen's on line construction algorithm

我在尝试理解“测试和拆分”过程时遇到了问题,具体如下: 程序测试和拆分(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 转换t(k)??

【问题讨论】:

    标签: algorithm suffix-tree


    【解决方案1】:

    可能您已经想通了,不再需要答案,但是由于我在尝试理解它时遇到了同样的问题,并且将来可能对其他人有用,所以我认为答案是下面那个。

    Ukkonen's on line construction algorithm,在第 7 页你可以读到:

    ...
    STrie(T) 中两个显式状态 sr 之间的转换路径拼出的字符串 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) 通过 sr。我们可以选择最小的这样的i,让kp指向这个Ti的子串sub>sr 的转换路径拼写出来。一个转移g′(s, (k, p)) = r被称为一个a——转移如果tk = a 。对于每个 a ∈ Σ,每个 s 最多可以有一个 a–transition。
    ...

    这意味着我们正在寻找最小的索引 kp 使得 tk 。 . . tp = w in T
    => 如果在 T 中出现不止一次 w,对于 kp,我们总是引用第一个。

    现在,过程 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' 但索引 kk' 可以不同,因为我们总是指向字符串 wT 中的第一次出现(还要记住,从一个状态可以有最多一个以字符 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)) 并返回新的显式状态。

    【讨论】:

    • 我被困在论文的同一个地方,很高兴我找到了你的答案!
    • @pterodragon 从状态 s 我们要读取由该对表示的字符串 w=t(k)...t(p)指针(k,p)。从 s 只能有一个 t(k)-transition(表示以字符 t(k) 开头的转换),但如果在 T 中有另一个字符串 w'=t(k')...t(p') 使得 w'=wk' 然后,在转换函数 g' 中表示字符串 w 而不是对 (k,p) 我们将使用 (k',p') 对,它拼写相同的字符串但具有较低的指针。在这种情况下 k'!=k 但它总是 t(k)=t(k')
    • 在论文中,“cacao”字符串在构造过程中不会为任何 s(j) 生成 k' != k。能举个具体的例子吗?
    • 实际上,我尝试使用我的算法的 Python 实现(您可以找到 here)为“cacao”构建后缀树,它在 3 次调用中使用了 k'!=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-indexed notation。在您的代码中它是 0-indexed)跨度>
    猜你喜欢
    • 1970-01-01
    • 2015-04-01
    • 2010-11-21
    • 2014-11-21
    • 1970-01-01
    • 2012-03-16
    • 2012-12-25
    • 1970-01-01
    相关资源
    最近更新 更多