.Net中的某些集合類型具有可選的「初始容量」構造函數參數。例如:集合類型的初始容量,例如詞典,列表
Dictionary<string, string> something = new Dictionary<string,string>(20);
List<string> anything = new List<string>(50);
我似乎無法找到MSDN上這些對象的默認初始容量。
如果我知道我只會在一本字典中存儲12個左右的項目,那麼將初始容量設置爲20之類沒有意義嗎?
我的推理是,假設容量增長就像它爲StringBuilder做的那樣,每當容量被擊中時會翻倍,並且每次重新分配都很昂貴,爲什麼不預先將大小設置爲你知道將容納你的數據的東西,有一些額外的空間以防萬一?如果最初的容量是100,而且我知道我只需要十幾個,那麼這個內存的其餘部分似乎就沒有分配。
質數計算可能會處理散列衝突和探測輸入位置。根據內部機制,如果他們只在每個散列處存儲一個值,則他們需要輔助存儲位置。如果您不使用素數,那麼您可能會發現可能無法插入的散列。 – Matt 2010-05-04 03:40:56
詞典使用鏈接。素數表格大小彌補了較差的散列函數。好的散列函數產生隨機分佈;現代哈希表中使用了兩種表大小的功能(.net哈希表基於Java哈希表,該哈希表也使用素數,因爲在哈希函數較差的日子裏,這是一種老辦法)。由於微軟沒有提供內置的散列組合方法,因此許多自制的散列函數會產生較差的分佈,所以有時候素數選擇會得到補償,直到散列函數產生多個素數。 –
2013-03-21 00:40:21