【问题标题】:Key update in Java’s TreeMapJava 的 TreeMap 中的关键更新
【发布时间】:2015-12-05 18:24:06
【问题描述】:

是否有机会一次性更新 TreeMap 中最小键条目 (firstEntry()) 的键? 因此,例如,如果我 pollFirstEntry(),检索和删除条目需要 O(log n) 时间。之后,我使用所需的键创建一个新条目并将其放回 TreeMap,这也需要 O(log n) 时间。因此,我花费了 O(2 log n) 时间,在逻辑上可能只是 O(1+log n) = (log n) 时间的情况下。

我很乐意避免删除条目,但在 firstEntry() 方法捕获它时更新它。 如果 TreeMap 不可能,任何人都可以建议一个替代的 PriorityQueue,如数据结构,在可能的情况下更新最少条目的键。

【问题讨论】:

  • 您是否真的遇到了可以通过此方法解决的性能问题,或者您认为它的效率有点低?
  • 我只是想弄清楚有经验的人如何克服缺少 updateLeastEntryKey() 方法的情况。而且我认为应该避免花费对数时间而不是常数。
  • 听起来您像使用优先级队列一样使用它。另见stackoverflow.com/q/1871253/3788176
  • “有经验的人”,正如你所说,注意Map javadoc 中的行:“注意:如果将可变对象用作映射键,则必须非常小心。如果对象的值以影响相等比较的方式更改,而对象是映射中的键,则不指定映射。"
  • Java Collections 框架的任何结构都不支持更新定义对象是否等于 到同一类的另一个对象的属性。同样适用于hashCode(),顺便说一句。 O(2 log n) 时间有什么问题?这是一个很好的权衡,恕我直言。

标签: java data-structures priority-queue treemap red-black-tree


【解决方案1】:

O(2 log N) 被正确地视为O(log N)。但是不,因为地图中的条目更改到另一个位置(在树中),所以不能这样做。几乎唯一不包含此属性的数据结构是键值对列表,这是一个糟糕的O(N) 或您可能喜欢的O(N/2)

如果键可以用作大数组中的索引,那么O(1) 将保持不变,仍然是 2 次操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多