Dot-Net

.NET 通用字典是否應該初始化為容量等於它將包含的項目數?

  • December 14, 2021

如果我有 100 個項目將儲存在字典中,我應該這樣初始化它嗎?

var myDictionary = new Dictionary<Key, Value>(100);

我的理解是 .NET 字典在達到給定負載時會在內部調整自身大小,並且負載門檻值被定義為容量的比率。

這表明如果將 100 項添加到上述字典中,那麼當添加其中一項時,它會自行調整大小。調整字典大小是我想避免的,因為它會影響性能並且浪費記憶體。

散列衝突的機率與字典中的載入成正比。因此,即使字典不調整自身大小(並使用其所有插槽),性能也會因這些衝突而降低。

假設您知道字典中有多少項,應該如何最好地決定將字典初始化到什麼容量?

您應該將字典容量初始化為什麼取決於兩個因素:(1) gethashcode 函式的分佈,以及 (2) 您必須插入多少項。

您的雜湊函式應該是隨機分佈的,或者應該為您的輸入集專門製定。讓我們假設第一個,但如果您對第二個感興趣,請查找完美的雜湊函式。

如果您有 100 個項目要插入字典,一個隨機分佈的雜湊函式,並且您將容量設置為 100,那麼當您將第 i 個項目插入雜湊表時,您有 (i-1) / 100 的機率插入時項目將與另一個項目發生衝突。如果您想降低這種碰撞機率,請增加容量。將預期容量加倍會使碰撞的機會減半。

此外,如果您知道訪問字典中每個項目的頻率,您可能希望按頻率遞減的順序插入這些項目,因為您首先插入的項目平均訪問速度更快。

引用自:https://stackoverflow.com/questions/414109