我查看过很多文献,但是我没有找到任何关于删除或插入子串到后缀树的信息。只有Ukkonen或McCreight用于构建树的算法
最穷的方法是在删除或插入子字符串后重建树。但我认为这是最好的方法
例如(位置从0开始计算):
我有“abcdef”的后缀树,我需要删除1到3之间的符号。然后我将使用带有“aef”的后缀树。然后我需要从位置1字符串“as”添加。在此之后,我将使用带有“aasef”的后缀树。
你能救我吗?
答案 0 :(得分:1)
你要在你的问题中混合两个任务,首先搜索角色,然后再替换角色。后缀树会在第一部分为您搜索字符,现在您需要第二个算法来用新字符替换该字符。当替换字符时,原始后缀树变为无效,因此必须再次映射树以进行第二次替换。
你需要的是两件事,首先是“后缀数组”,这将使你更好地控制搜索字符及其位置,第二是“缓存算法”,这将帮助你更换。
答案 1 :(得分:0)
我刚刚开始使用后缀树,所以我可能错了,但似乎插入或删除可能会以非常激进的方式更改树。
“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点的树。