Algorithm 如何从后缀树中删除子字符串?

Algorithm 如何从后缀树中删除子字符串?,algorithm,insertion,suffix-tree,Algorithm,Insertion,Suffix Tree,我查阅了很多文献,但没有找到任何关于在后缀树中删除或插入子字符串的信息。只有Ukkonen或McCreight的构建树算法。 最糟糕的方法是在删除或插入子字符串后重建树。但我认为这是最好的方法。 例如(从0开始计算位置): 我有后缀树和“abcdef”,我需要删除1到3的符号。然后我将有后缀树和“aef”。然后我需要从位置1添加字符串“as”。在此之后,我将有后缀树与“aasef”。 你能帮我吗?你的问题中混合了两个任务,第一个是搜索角色,第二个是替换角色。后缀树第一部分为您搜索字符,现在您需要

我查阅了很多文献,但没有找到任何关于在后缀树中删除或插入子字符串的信息。只有Ukkonen或McCreight的构建树算法。
最糟糕的方法是在删除或插入子字符串后重建树。但我认为这是最好的方法。
例如(从0开始计算位置):
我有后缀树和“abcdef”,我需要删除1到3的符号。然后我将有后缀树和“aef”。然后我需要从位置1添加字符串“as”。在此之后,我将有后缀树与“aasef”。
你能帮我吗?

你的问题中混合了两个任务,第一个是搜索角色,第二个是替换角色。后缀树第一部分为您搜索字符,现在您需要第二个算法将该字符替换为新字符。当字符被替换时,原始后缀树变得无效,因此必须再次映射该树以进行第二次替换


您需要的是两件事,第一件是“后缀数组”,它可以让您更好地控制字符及其位置的搜索,第二件是“缓存算法”,它可以帮助您进行替换。

我刚刚开始使用后缀树,所以我可能错了,但似乎插入或删除可以以非常激进的方式改变树

“abcdef”是一个非常简单的后缀树:

abcdef
├a..$
├b..$
├c..$
├d..$
├e..$
└f$
在末尾添加“g”或在开头删除“a”非常简单

但假设我们在中间再加一个“a”:

abcadef
├a
│├b..$
│└d..$
├b
├c
├...
我们必须返回并从一开始检查每个字母,看看是否需要在此基础上插入节点。如果我们在结尾有一个字符,则相同:

abafef
├a
│├bafef$
│└fef$
├bafef$
├f
│├ef$
│└$
└ef$
如果您现在在末尾插入类似“ef”的内容,则必须遍历并在整个位置添加新节点

插入字符似乎需要重新检查字符串中的每个字符,即线性时间。由于Ukkonen的算法已经需要线性时间,因此不值得使用任何动态插入算法,每次都应该从头开始重新生成树,并确信这仍然很好


如果您不关心空间,您可以随时缓存树生成算法的每个步骤,然后在x点进行插入或删除时,只需将构建的树加载到x点即可。

Cn是否更具体?据我所见,您已经插入了字符串“abdc”,现在您想将其设置为“abd”(删除子字符串)或“abced”(插入子字符串),对吗?您可以在更新相应的后缀数组时添加/删除子字符串:(pdf)。但是我不能说任何关于后缀树的事情。