我目前正在开发自己的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 )。一些更新操作基于子字符串索引,如何在这种情况下执行它们?
注意:这个问题与语言无关,所以我没有包含c++ - 标记,但会显示一个小片段。
答案 0 :(得分:0)
如果你的通用后缀树中只有几个字符串,那么你可以使用唯一的终端符号(这些终端符号不应该在输入字符串中使用)在一个字符串中将它们连接在一起。/ p>
例如,假设您有5个字符串:str1,str2,str3,str4和str5,那么您可以将这5个字符串连接为str1 $ str2#str3 @ str4%str5,然后创建此连接字符串的后缀树
由于我们必须使用唯一的终端符号,因此可以在通用后缀树中添加多少个最大字符串。任何永远不会在输入字符串中使用的字符都可以作为终端符号。
因此,基于一组预定义的终端符号,我们可以编写代码。
以下文章可能会有所帮助。