根據this question .Net字典將其分配的空間大小調整爲至少是當前大小的兩倍的素數。爲什麼使用素數而不是當前大小的兩倍很重要? (我試圖用我的谷歌功夫找到答案,但無濟於事)爲什麼.Net字典調整爲素數?
12
A
回答
11
這是一個與choosing a good hashing function相關的算法實現細節,它提供了均勻分佈。不均勻分佈會增加碰撞次數和解決它們的成本。
5
由於質數的數學。他們不能被分解成不同的小數字。當您從存儲的項目中分散散列號碼時,您將獲得平均分配。如果您沒有素數,則取決於對象,分佈可能不均勻。
11
放入元素的存儲桶由(hash & 0x7FFFFFF) % capacity
決定。這需要均勻分佈。因此,如果多個條目是某個基數(hash1 = x1 * base
,hash2 = x2 * base
,...)的倍數,其中base
和capacity
不是互質(最大公約數> 1)用過的。由於素數與除自身以外的任何數字都是相互矛盾的,因此他們有較好的分配機會。
其中一個特別好的特性是,對於capacity > 30
,每個位對散列碼的貢獻是不同的。所以如果散列的變化集中在只有幾位,它仍然會導致一個很好的分佈。這就解釋了爲什麼兩個冪的能力是不好的:它們掩蓋了高位。一組只有高位不同的數字並不是不太可能。
我個人認爲他們選擇這個功能不好。它包含一個昂貴的模操作,並且如果條目是總容量的倍數,則其性能會下降。但對大多數應用程序來說,它似乎已經足夠好了。
相關問題
- 1. 爲什麼字典沒有在刪除後調整大小?
- 2. 爲什麼字典有.updateValue()?
- 3. 爲什麼在ojalgo中調整參數?
- 4. .net字典vs其他託管自定義數據結構,爲什麼.net字典如此之快?
- 5. 爲什麼.NET字典發出吱吱聲?
- 6. 爲什麼.net通用字典如此之大
- 7. 爲什麼Scrapy的字段是字典?
- 8. DIV未調整爲文字高度。爲什麼?
- 9. 更改字典鍵爲整數
- 10. 將字典值轉換爲整數
- 11. 將字符串整數的JSON字典轉換爲整數
- 12. 爲什麼在C#中通過引用添加字典元素?
- 13. 爲什麼Python字典的元素沒有得到序列
- 14. 爲什麼字典排序不確定?
- 15. KeyError爲什麼字典是空的?
- 16. 爲什麼空字典大於1?
- 17. 爲什麼字典似乎被顛倒?
- 18. 字典大小變化,爲什麼
- 19. 爲什麼採用字典攻擊
- 20. 爲什麼在PostScript中關閉字典?
- 21. 爲什麼我會收到空字典?
- 22. 爲什麼不統一Python字典?
- 23. .net字典有什麼不對?
- 24. 爲什麼我無法將此數字設置爲整數?
- 25. 爲什麼不將字節參數識別爲整數?
- 26. 爲什麼Java不autobox INT []爲整數[]
- 27. 將字符串編碼爲整數.NET
- 28. 爲什麼HTML輸入元素被瀏覽器調整大小?
- 29. 爲什麼我的Jquery元素不能調整大小?
- 30. 爲什麼我不能將數字作爲字符串更改爲整數?
作爲一個側面的想法給你的問題,有沒有人知道樹狀平衡的數據結構,調整到黃金大小? 也許我應該發表另一個問題 – 2011-01-09 11:36:54
什麼是.Net的字典背後的樹數據結構呢? – 2011-01-09 11:39:16