containsKey或get in Tree map是否使用binarySearch?

时间:2013-07-02 21:47:15

标签: java hashmap treemap

TreeMap中的元素已排序,因此我认为可能get(...)containsKey(...)使用二进制搜索。这些方法是否比HashMap中实现的方法更快,它们是否真的使用二进制搜索?

4 个答案:

答案 0 :(得分:2)

Not binary search but the complexity must be O(logn)

  

此实现为containsKey,get,put和remove操作提供了有保证的log(n)时间成本。算法是对Cormen,Leiserson和Rivest的算法导论的改编。

注意它实际上是红黑树:

  

基于红黑树的NavigableMap实现

但请注意,尽管我总是讨厌将哈希表视为O(1)数据结构,但几乎所有实际目的都是HashMap O(1),除非:例如,你选择了一个非常糟糕的哈希函数或大量过载地图。

答案 1 :(得分:2)

打开课程TreeMapHashMap的文档,您将得到答案。

TreeMap中,它说:

  

此实施为containsKeygetputremove操作提供保证log(n)时间成本。算法是对Cormen,Leiserson和Rivest的算法导论的改编。

HashMap中,它说:

  

此实现为基本操作(getput提供恒定时间性能,假设散列函数在存储桶之间正确地分散元素。

如您所见,HashMap O(1),而TreeMap O(log(n)),因此{ {1}}更快。

您可以在以下维基百科条目中阅读有关哈希表红黑树(TreeMap使用的树的类型)的更多信息:

在这些文章的右侧,您可以看到这些结构上最常见操作的复杂性摘要。

答案 2 :(得分:1)

HashMap速度更快。它的get()containsKey()方法是O(1)(如果正确实现了hashCode,则为常量时间。)

TreeMap的get()containsKey()是O(log(n)),他们当然使用树结构来快速完成这些操作。

答案 3 :(得分:0)

如果您对OpenJDK 7的实现感兴趣,那么它很容易理解。是的,这是一个二元搜索:

final Entry<K,V> getEntry(Object key) {
    // Offload comparator-based version for sake of performance
    if (comparator != null)
        return getEntryUsingComparator(key);
    if (key == null)
        throw new NullPointerException();
    Comparable<? super K> k = (Comparable<? super K>) key;
    Entry<K,V> p = root;
    while (p != null) {
        int cmp = k.compareTo(p.key);
        if (cmp < 0)
            p = p.left;
        else if (cmp > 0)
            p = p.right;
        else
            return p;
    }
    return null;
}

public boolean containsKey(Object key) {
    return getEntry(key) != null;
}

getEntryUsingComparator是同一个二分查找,只使用Comparator对象。