一次从平衡二叉树中删除多个项目
Posted
技术标签:
【中文标题】一次从平衡二叉树中删除多个项目【英文标题】:Removing multiple items from balancing binary tree at once 【发布时间】:2013-07-14 01:32:23 【问题描述】:我在一个项目(Java 的TreeMap
)中使用带有链接叶的红黑二叉树,以快速查找和遍历项目。问题是我可以轻松地在树上获得 35000 个左右的项目,并且有几次我必须删除“X 以上的所有项目”,这几乎可以是整个树(就像一次 30000 个项目,因为它们都更大比 X),而且每次移除它们并重新平衡树都需要花费太多时间。
这里有什么算法可以帮助我(所以我可以自己实现树)?
【问题讨论】:
您通常还对数据做什么?总是需要权衡取舍,但您或许可以针对主要使用模式优化数据结构/算法。 地图用于语法高亮组件,它使用从整数到标记的映射来跟踪每个标记及其颜色。每个绘图周期我都需要获取树的一部分(“位置 X 和 Y 之间的每个标记”),这就是为什么这些项目也被链接,以便快速迭代。每当用户在组件上键入内容时,删除后的每个标记...因此,如果他在文件开头进行编辑,则必须立即删除许多节点。如果他在文件末尾进行编辑,则只需从树中删除一些。我正在尝试优化这种行为。 =/ 【参考方案1】:您正在寻找红/黑树上的 split 操作,该操作采用红/黑树和某个值 k 并将其拆分为两棵红/黑树,其中一棵具有所有键大于或等于 k 并且所有键都小于 k。如果您扩充结构以存储一些额外信息,这可以在 O(log n) 时间内实现。在您的情况下,由于您使用的是 Java,因此您可以拆分树并丢弃您不关心的树的根,以便垃圾收集器可以处理它。
从第 9 页开始,this paper 中提供了有关如何实现此功能的详细信息。它是根据结合了两个树木,但我认为说明很清楚。
希望这会有所帮助!
【讨论】:
这有帮助!谢谢。 :)以上是关于一次从平衡二叉树中删除多个项目的主要内容,如果未能解决你的问题,请参考以下文章