2016-09-22 49 views
2

雖然定義一個HashSet爲什麼HashSet構造函數0.75的默認填充率?

HashSet<Integer> hs = new HashSet<Integer>(10,(double)0.50);

構造函數的第二個參數被稱爲「填充比」爲0.75的默認值。

我想知道是否有一個邏輯原因默認爲0.75。

+0

閱讀'hashset''s doc。 – passion

+1

哈希表受到_hash碰撞_和更高的加載因子(比「填充率」更常見的術語)意味着更多的碰撞。這減少了插入和查找性能。您選擇的任何因素都會給您在空間和時間之間進行權衡,0.75是經驗選擇的值。這對於「單獨鏈接」散列表設計非常有用; _open-addressed_設計對碰撞要敏感得多,需要較低的負載因子(0.70是最大有用值)。 –

回答

1

一個HashSetHashMap支持,所以你可以參考HashMap's javadoc爲0.75的選擇作爲默認值的理由:

作爲一般規則,默認加載因子(.75)時間和空間成本之間的良好折衷。較高的值會減少空間開銷,但會增加查找成本(反映在HashMap類的大部分操作中,包括getput)。

2

選擇背後的確存在邏輯推理。如果我們瞭解HashSetHashMap支持,並承認在您的文章中構造函數調用一個HashMap構造:

public HashSet(int initialCapacity, float loadFactor) { 
    map = new HashMap<>(initialCapacity, loadFactor); 
} 

,然後進行相關的HashMapdocumentation我們可以看到背後的重要選擇的邏輯推理。

作爲一般規則,默認加載因子(.75)在時間和空間成本之間提供良好的 權衡。較高的值會減少空間開銷,但會增加查找成本(反映在大部分HashMap類的 操作中,包括get和put)。在設置其初始容量時,地圖中預期的 條目數和其負載因子應該被納入 帳戶,以最大程度地減少重新哈希操作的次數。如果初始容量大於 最大入口數除以負載因子,則不會發生重新運行 操作。

相關問題