3

在使用伸展树的绳索数据结构的标准实现中,节点将根据测量每个节点从字符串开始的位置的排名统计量进行排序,因此通常在二叉搜索树中找到的键将是不相关的,将他们不是吗?

我问是因为下图中显示的键(感谢维基百科!)是字母,一旦节点数量超过所选字母的长度,它们可能会变得不唯一。使用整数或完全避免使用键不是更好吗?

绳索数据结构

另外,谁能指出我在每次操作后重新计算排名统计的逻辑的良好实现?

据推测,如果拆分的索引位于附加到特定节点的子字符串中,例如,在上面节点 E 上的“Hel”和“llo_”之间,您将从 E 中删除子字符串,将其拆分并重新附加为两个孩子E. 对吗?

最后,经过一定次数的这样的操作,我想这棵树的叶子可能和字母一样多。跟踪它并根据需要修剪树(通过组合子字符串)的最佳方法是什么?

谢谢!

4

1 回答 1

1

对于它的价值,您可以通过将子字符串附加到二叉搜索树的每个节点(不仅仅是如上所示的叶节点)来使用 Splay Trees 实现 Rope。

每个节点的等级是它的大小加上它的左子树的大小。但是在展开操作期间重新计算等级时,您也需要记住沿着node.left.right分支走。

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

如上所述,每个节点记录(除了它的左、右和父属性等)它的等级、大小(以字符为单位)以及它在您尝试修改的字符串中表示的第一个字符的位置。这样,您实际上不会修改初始字符串:您只需对树的位进行操作,并在准备好时通过按顺序遍历它来重现最终字符串。

于 2018-06-11T04:24:51.747 回答