2013-07-02 20 views

回答

2

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

此實現提供了保證的log(n)的時間成本,爲containsKey方法,GET,PUT和刪除操作。算法是Cormen,Leiserson和Rivest的算法簡介中的算法的改編。

注意它實際上是一個紅黑樹:基於

紅黑樹NavigableMap實現

不過需要注意的是,雖然我永遠恨對待哈希表的O (1)數據結構盲目地,幾乎所有的實際用途HashMap是O(1),除非:例如,你選擇一個非常糟糕的散列函數或大量超載地圖。

1

HashMap更快。它的get()containsKey()方法是O(1)(恆定時間,只要hashCode被正確實現)。

TreeMap的get()containsKey()是O(log(n)),它們當然使用樹結構來使這些操作更快。

2

打開類TreeMapHashMap的文檔,您將得到您的答案。

TreeMap,它說:

此實現提供了containsKeygetputremove操作保證的log(n)的時間成本。算法是Cormen,Leiserson和Rivest的算法簡介中的算法的改編。

HashMap,它說:

此實現提供爲基本操作(getput穩定的性能,假定哈希函數將分散的桶中正確的元素。

正如你可以看到,HashMapO(1),而TreeMapO(的log(n)),因此HashMap更快。

你可以在下面的維基百科條目閱讀更多關於哈希表紅黑樹(由TreeMap的使用樹的類型):

在這些文章的右側,您可以看到這些結構上最常見操作的複雜性總結​​。

+0

哈希映射O(1)可能比RBT O(log n)慢得多:它主要依賴於n以及計算密鑰哈希值w.r.t來比較兩個密鑰的代價。所以你不能總結hashmap是(總是)更快。 –

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對象。

+1

這不是一個二進制搜索(至少不是Arrays.binarySearch())的意義。 –

+0

@JBNizet:這是一個紅黑樹(排序二叉搜索樹)。我沒有將它與'Arrays.binarySearch()'進行比較,它需要預先排序的數組。但它基本上執行相同的算法,即在_middle_開始並比較密鑰,然後向左或向右。 – nif