Data structures 使用二进制搜索树(splay树)实现Rope数据结构

Data structures 使用二进制搜索树(splay树)实现Rope数据结构,data-structures,binary-search-tree,splay-tree,Data Structures,Binary Search Tree,Splay Tree,在使用splay树的标准实现中,节点将根据从字符串开始测量每个节点位置的秩统计进行排序,所以通常在二叉搜索树中找到的键将是无关的,不是吗 我这样问是因为下图中显示的键(感谢Wikipedia!)是字母,一旦节点数超过所选字母表的长度,这些键可能会变得非唯一。使用整数或完全避免使用键不是更好吗 另外,有人能告诉我一个很好的逻辑实现,在每次操作后重新计算排名统计信息吗 假设,如果拆分的索引位于附加到特定节点的子字符串内,例如,在上面节点E上的“Hel”和“llo_”之间,您将从E中删除子字符串,拆

在使用splay树的标准实现中,节点将根据从字符串开始测量每个节点位置的秩统计进行排序,所以通常在二叉搜索树中找到的键将是无关的,不是吗

我这样问是因为下图中显示的键(感谢Wikipedia!)是字母,一旦节点数超过所选字母表的长度,这些键可能会变得非唯一。使用整数或完全避免使用键不是更好吗

另外,有人能告诉我一个很好的逻辑实现,在每次操作后重新计算排名统计信息吗

假设,如果拆分的索引位于附加到特定节点的子字符串内,例如,在上面节点E上的“Hel”和“llo_”之间,您将从E中删除子字符串,拆分它并将其作为E的两个子字符串重新连接。对吗

最后,经过一定数量的这样的操作,我想,这棵树最终可能会有和字母一样多的叶子。最好的方法是什么来跟踪并在必要时修剪树(通过组合子字符串)


谢谢

值得一提的是,您可以通过将子字符串附加到二叉搜索树的每个节点(而不仅仅是如上所示的叶节点),使用Splay树实现Rope

每个节点的排名是其大小加上其左子树的大小。但是,在splay操作期间重新计算列组时,您需要记住也要沿着
节点.left.right
分支走

如果每个节点都记录了对它所表示的子字符串的引用(参见实际的子字符串本身),那么一切都会运行得更快。这样,当拆分操作位于现有节点内时,只需修改节点的属性以反映要拆分的子字符串的右侧部分,然后添加另一个节点以表示左侧部分并将其与左侧子树合并


如上所述,每个节点记录(除了其左、右和父属性等)其等级、大小(以字符为单位)以及它在试图修改的字符串中表示的第一个字符的位置。这样,您就永远不会真正修改初始字符串:您只需对树的位执行操作,并在准备就绪时按顺序遍历最终字符串即可

这些字母不是数据结构的一部分。它们仅出现在图形中,用于标识文本中讨论的节点。