【发布时间】: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