在使用splay树的Rope data structure的标准实现中,节点将根据从字符串的开头测量每个节点的位置的秩统计来排序,因此通常在二叉搜索树中找到的键会不相关,不是吗?
我问,因为下图中显示的键(感谢维基百科!)是字母,一旦节点数超过所选字母的长度,这可能会变得非独特。使用整数或完全避免使用密钥会不会更好?
另外,任何人都能指出我在每次操作后重新计算排名统计数据的逻辑的良好实现吗?
据推测,如果分割的索引属于附加到特定节点的子串,例如,在" Hel"之间。和" llo _"在上面的节点E上,您将从E中删除子字符串,将其拆分并重新附加为E的两个子项。正确吗?
最后,在经过一定数量的此类操作之后,我认为这棵树最终可能会留下与字母一样多的树叶。什么是最好的方法来跟踪和修剪树(通过组合子串)必要的?
谢谢!
答案 0 :(得分:1)
对于它的价值,您可以通过将子字符串附加到二叉搜索树的每个节点(而不仅仅是如上所示的叶节点)来使用Splay Trees实现Rope。
每个节点的等级是它的大小加上其左子树的大小。但是当在展开操作期间重新计算排名时,您还需要记住沿着node.left.right
分支走下去。
如果每个节点都记录了它所代表的子串的引用(参见实际的子串本身),那么一切都运行得更快。这样,当拆分操作属于现有节点时,您只需要修改节点的属性以反映要拆分的子串的正确部分,然后添加另一个节点来表示左侧部分并将其合并左子树。
如上所述,每个节点记录(除了它的左,右和父属性等)其等级,大小(以字符为单位)以及它在您尝试的字符串中表示的第一个字符的位置修改。这样,你永远不会真正修改初始字符串:你只需对树的位进行操作,并在你准备好按顺序完成后再现最终的字符串。