【问题标题】:At what level is a given element in a Java TreeSet?Java TreeSet 中的给定元素处于什么级别?
【发布时间】:2010-09-03 00:00:29
【问题描述】:

有没有人知道一种快速检测TreeSet 中给定元素处于什么级别的方法?层级是指该元素在树中的深度,即其祖先的数量。

背景。 我使用 Java 的 TreeSet 类来存储我的元素。 为了比较两个元素,我需要计算一些关于它们的辅助信息。我无法为每个元素存储这些辅助信息,因为它会占用太多内存。 另一方面,如果我为每次比较重新生成辅助信息,我的程序就太慢了。 当一个元素被插入到 TreeSet 中时,我当前的实现会计算它插入的元素的辅助信息,并且在元素在 TreeSet 中找到它的位置之前不会重新计算它。之后,辅助信息被丢弃。 为了加快我的程序,我还想为 TreeSet 的顶层存储辅助信息,因为它们涉及许多比较。所以,在比较两个节点之后,我想根据它们在TreeSet中的深度来决定是保留还是丢弃它们的辅助信息。

更新。 如果有人可以建议一个替代类来实现某种平衡树(AVL树、红/黑树、Splay树……),并且可以访问高度,我也将不胜感激一个元素。

【问题讨论】:

  • TreeSet 是一个Set,它是一个Collection,它是扁平的。它不存储任何分层信息。
  • @Steve:有没有更符合我需求的标准课程?

标签: java collections binary-tree treeset


【解决方案1】:

TreeSet 根本不会暴露每个节点的确切深度。如果你想这样做,你必须自己写。

您可以做一些事情,比如让集合中的每个键都引用一个管理辅助信息的共享对象。每次在密钥上调用compareTo() 时,它都会通知管理器更新其针对该密钥的计数器。经理将使用这些统计数据来决定哪些应该维护他们的辅助信息。

【讨论】:

  • 谢谢,埃里克森。我同意收集一些关于比较的统计信息可能是个好主意;我没有想到这一点。将它与最近最少使用的技术结合起来也可能会有所帮助,以防新元素被插入树的高处,或者由于红色的内部平衡而将底部的元素提升到树的顶部/黑树。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 2019-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多