我一直在研究这个链接(靠近底部)描述的树数据结构:
http://sigpipe.macromates.com/2009/08/13/maintaining-a-layout/
提到该数据结构可以是指树。然而,经过对手指树的更多研究,我发现这缺乏使手指树指树的“手指”。相反,它似乎只是一个带注释的二叉树(用子树大小注释)。
你知道这个数据结构的现有实现(用任何语言)我可以用作我自己实现的参考(尽管,不是函数式编程语言中的实现) )?
或者,将子树大小注释改造为现有树数据结构的最佳方法是什么?
谢谢!
答案 0 :(得分:4)
Simon Tatham's Counted B-Trees类似。如果用tweak中的缓冲区宽度替换节点计数,则会提供ropes之类的操作。
事实上,通过阅读您引用的页面,我发现它被用作编辑器的表格或行表格
在论文Positional Delta Trees to reconcile updates with read-optimized data storage中,作者提出了一个树,其中关于树中节点之间保持不变量的行为与 xanadu的enfilades 有着惊人的相似之处。计算B树也很相似。
答案 1 :(得分:2)
我在github上有一个名为Boost.Intrusive Annotated Trees的项目,旨在为Boost.Intrusive中的子树计数等注释提供通用支持。子树计数是我原来的用例。
目前它需要C ++ 11可变参数模板并且仅支持rbtree,但它可以工作,我希望及时删除这两个限制
更新:现在使用C ++ 03构建。仍然只支持rbtree。
当与子树计数注释一起使用时,它与jordan在上面的答案中描述的类似 - 它在每个节点处计算(左+右+ 1)。实现是完全不同的 - 它适用于任何节点和/或价值特征;相反,注释更新被集成到rbtree算法中,这使得重新计算的次数保持最小。
答案 2 :(得分:0)
我根据前几天问的问题实施了类似的东西。我向boost :: intrusive :: rbtree / avltree节点添加了注释,以计算每个子树的大小(foreach node count = node-> left-> count + node-> right-> count + 1)。我通过使用set_parent,set_left和set_right的boost value_traits钩子对树的插入/删除/重新平衡执行此更新。差不多,正如您引用的站点中所述,在每次更新节点后,更新当前节点的大小,然后遍历树,直到您到达根目录,随时更新每个节点的大小。
当您想要在特定位置插入树时,问题就出现了。在您执行此操作的那一刻,您将使树结构的键排序不变量无效。这意味着您将无法通过密钥执行有效的O(log n)查找。但是,如果你想要的话,你可能不需要大小注释。