Ukkonen的广义后缀树算法

时间:2015-02-02 13:27:15

标签: algorithm suffix-tree

我目前正在开发自己的Suffix Tree实现(使用C ++,但问题仍然是语言不可知)。我研究过the original paper from Ukkonen。这篇文章很清楚,所以我开始研究我的实现并试图解决广义后缀树的问题。

在树中,从节点到另一个节点的每个子串都使用一对整数表示。虽然这对于常规后缀树来说很简单,但是当多个字符串在同一个树中共存时(这将成为广义后缀树)会出现问题。实际上,现在这样一对是不够的,我们需要另一个变量来说明我们正在使用哪个参考字符串。

一个简单的例子。考虑字符串coconut

  • 子字符串nut(4,6)
  • 我们在树中添加troublemaker(4,6)现在可以是:
    • nut如果我们引用第一个字符串。
    • ble如果我们引用第二个字符串。

为了解决这个问题,我想添加一个代表字符串的id:

// A pair of int is a substring (regular tree)
typedef std::pair<int,int> substring;
// We need to bind a substring to its reference string:
typedef std::pair<int, substring> mapped_substring;

我目前面临的问题如下:

我得到一个查询,在树中添加一个字符串。在算法期间,我可能必须检查与其他已注册字符串相关的现有转换,表示为三元组(引用字符串id k p )。一些更新操作基于子字符串索引,如何在这种情况下执行它们

注意:这个问题与语言无关,所以我没有包含 - 标记,但会显示一个小片段。

1 个答案:

答案 0 :(得分:0)

如果你的通用后缀树中只有几个字符串,那么你可以使用唯一的终端符号(这些终端符号不应该在输入字符串中使用)在一个字符串中将它们连接在一起。

例如,假设您有5个字符串:str1,str2,str3,str4和str5,那么您可以将这5个字符串连接为str1 $ str2#str3 @ str4%str5,然后创建此连接字符串的后缀树

由于我们必须使用唯一的终端符号,因此可以在通用后缀树中添加多少个最大字符串。任何永远不会在输入字符串中使用的字符都可以作为终端符号。

因此,基于一组预定义的终端符号,我们可以编写代码。

以下文章可能会有所帮助。

Generalized Suffix Tree