對TreeMap
中的元素進行排序,因此我認爲可能get(...)
或containsKey(...)
使用二分搜索。這些方法是否比在HashMap
中實施的方法更快,他們真的使用二分搜索嗎?包含鍵或獲取樹圖使用binarySearch?
回答
Not binary search but the complexity must be O(logn):
此實現提供了保證的log(n)的時間成本,爲containsKey方法,GET,PUT和刪除操作。算法是Cormen,Leiserson和Rivest的算法簡介中的算法的改編。
注意它實際上是一個紅黑樹:基於
紅黑樹NavigableMap實現
不過需要注意的是,雖然我永遠恨對待哈希表的O (1)數據結構盲目地,幾乎所有的實際用途HashMap是O(1)
,除非:例如,你選擇一個非常糟糕的散列函數或大量超載地圖。
HashMap更快。它的get()
和containsKey()
方法是O(1)(恆定時間,只要hashCode被正確實現)。
TreeMap的get()
和containsKey()
是O(log(n)),它們當然使用樹結構來使這些操作更快。
打開類TreeMap
和HashMap
的文檔,您將得到您的答案。
在TreeMap
,它說:
此實現提供了
containsKey
,get
,put
和remove
操作保證的log(n)的時間成本。算法是Cormen,Leiserson和Rivest的算法簡介中的算法的改編。
在HashMap
,它說:
此實現提供爲基本操作(
get
和put
)穩定的性能,假定哈希函數將分散的桶中正確的元素。
正如你可以看到,HashMap
是O(1),而TreeMap
是O(的log(n)),因此HashMap
更快。
你可以在下面的維基百科條目閱讀更多關於哈希表和紅黑樹(由TreeMap的使用樹的類型):
在這些文章的右側,您可以看到這些結構上最常見操作的複雜性總結。
如果你對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
對象。
這不是一個二進制搜索(至少不是Arrays.binarySearch())的意義。 –
@JBNizet:這是一個紅黑樹(排序二叉搜索樹)。我沒有將它與'Arrays.binarySearch()'進行比較,它需要預先排序的數組。但它基本上執行相同的算法,即在_middle_開始並比較密鑰,然後向左或向右。 – nif
- 1. BinarySearch樹
- 2. php導航使用獲取或包含
- 3. 獲取包含使用OLEDB
- 4. 獲取包含使用PowerShell
- 5. 獲取包含使用PHP
- 6. 獲取包含在地圖
- 7. 獲取包含圖像
- 8. 如何使用包含空格的鍵從Redis獲取值?
- 9. 獲取子視圖包含視圖
- 10. 使用LINQ與包含 - 獲取錯誤
- 11. 獲取包含TDS
- 12. 獲取包含類
- 13. 如何獲取包含圖像
- 14. 獲取包含圖像的PDF頁面
- 15. 使用cron獲取包含jQuery內容的視圖?
- 16. 使用Neo4j獲取樹
- 17. 如何獲取ExtJS4中樹節點的新記錄(包含suppressevents)
- 18. 使用「ComplexHeatmap」包的熱圖樹狀圖
- 19. 在div或模式中包含tab鍵
- 20. 不包含與引用匹配的主鍵或候選鍵
- 21. 使用BinarySearch進行搜索
- 22. 獲取包含個XML
- 23. 獲取包含對象
- 24. jQuery的獲取包含ID
- 25. 獲取JFrame包含JPanel
- 26. 獲取包含函數
- 27. 獲取包含的JavaScript
- 28. JDOM獲取包含內容
- 29. 使用Jena獲取包含特定RDF資源的包(容器)
- 30. 獲取chat_id從包含specifc用戶
哈希映射O(1)可能比RBT O(log n)慢得多:它主要依賴於n以及計算密鑰哈希值w.r.t來比較兩個密鑰的代價。所以你不能總結hashmap是(總是)更快。 –