【问题标题】:Removing multiple items from balancing binary tree at once一次从平衡二叉树中删除多个项目
【发布时间】:2013-07-14 01:32:23
【问题描述】:

我在一个项目(Java 的TreeMap)中使用带有链接叶的红黑二叉树,以快速查找和遍历项目。问题是我可以轻松地在树上获得 35000 个左右的项目,并且有几次我必须删除“X 以上的所有项目”,这几乎可以是整个树(就像一次 30000 个项目,因为它们都更大比 X),而且每次移除它们并重新平衡树都需要花费太多时间。

这里有什么算法可以帮助我(所以我可以自己实现树)?

【问题讨论】:

  • 您通常还对数据做什么?总是需要权衡取舍,但您或许可以针对主要使用模式优化数据结构/算法。
  • 地图用于语法高亮组件,它使用从整数到标记的映射来跟踪每个标记及其颜色。每个绘图周期我都需要获取树的一部分(“位置 X 和 Y 之间的每个标记”),这就是为什么这些项目也被链接,以便快速迭代。每当用户在组件上键入内容时,删除后的每个标记...因此,如果他在文件开头进行编辑,则必须立即删除许多节点。如果他在文件末尾进行编辑,则只需从树中删除一些。我正在尝试优化这种行为。 =/

标签: algorithm data-structures binary-search-tree tree-balancing


【解决方案1】:

您正在寻找红/黑树上的 split 操作,该操作采用红/黑树和某个值 k 并将其拆分为两棵红/黑树,其中一棵具有所有键大于或等于 k ​​并且所有键都小于 k。如果您扩充结构以存储一些额外信息,这可以在 O(log n) 时间内实现。在您的情况下,由于您使用的是 Java,因此您可以拆分树并丢弃您不关心的树的根,以便垃圾收集器可以处理它。

从第 9 页开始,this paper 中提供了有关如何实现此功能的详细信息。它是根据结合了两个树木,但我认为说明很清楚。

希望这会有所帮助!

【讨论】:

  • 这有帮助!谢谢。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 2018-08-30
相关资源
最近更新 更多