【问题标题】:TreeMap lastKey lookup timeTreeMap lastKey 查找时间
【发布时间】:2015-02-06 12:23:54
【问题描述】:

SortedMap 接口的 TreeMap.lastKey() 部分的时间复杂度是多少?

oracle 文档提到了有关 TreeMaps 的内容:

此实现为 containsKey、get、put 和 remove 操作提供有保证的 log(n) 时间成本。

【问题讨论】:

  • 它也应该是 O(log(n))。它大部分是平衡的,需要始终向右走。
  • 您还可以查看源代码,了解它是如何实现的。之后答案会很简单。
  • 我明白了。即使在从地图中删除对象之后,是否有一种优雅的方法可以始终跟踪最后一个键/值?也许使用地图 entrySet?
  • @ArjunPatel O(logn) 太大了吗?你的用例是什么?
  • 您可以通过包装/检测所有映射的变异方法来跟踪映射的最大键(不要忘记迭代器的remove() 方法和子映射的变异器,以及它们的 迭代器和子图等)。不过,这肯定不够优雅,而且会降低性能,尤其是多元素删除方法。

标签: java map treemap sortedmap


【解决方案1】:

根据Open JDK中的实现,是O(log N):

public K lastKey() {
    return key(getLastEntry());
}
final Entry<K,V> getLastEntry() {
    Entry<K,V> p = root;
    if (p != null)
        while (p.right != null)
            p = p.right;
    return p;
}

lastKey() 调用getLastEntry(),它会继续获取右子树,直到没有更多节点可以获取。由于该实现将树保持在平衡状态,因此迭代次数为 O(log N)。

【讨论】:

  • 很容易犯直观的错误,即最后一个条目在数据结构的“末尾”很容易访问。我不得不提醒自己,红黑树的“易于访问”条目实际上是 median 元素(即树根的元素)。
【解决方案2】:

如果TreeMap 可以保证containsKey() 的 O(log(n))(正如它所做的那样),那么它应该能够在 O(log(n) 中做到lastKey() ) 也是如此。任何可以确定产生 O(log(n)) 键查找的树结构也可以支持在 O(log(n)) 中查找最大键。

虽然没有什么能从本质上排除更糟糕的脑死亡实现,但我认为对java.util.TreeMap 忽略这种可能性是相当安全的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多