爲了將一個元素放入一個無序集中,我們計算它的哈希值並將其放到相應的桶中。然而,我們通常比散列函數的值範圍少得多。如何計算桶和散列值的對應關係?似乎有些函數反映(0 ... size_t) - >(0 ... size_of_buckets - 1)。但使用這樣的函數可能會導致大量的衝突,即使對於良好的散列函數。無序容器桶的大小散列函數?
回答
我不知道確切的std::unordered_map
行爲是否被定義在標準中。然而,基本原則是這樣的:始終保持桶的數量大於容器的大小乘以一個小數字(這個小數字是1.0/load_factor)。這樣,碰撞應該很少。
對於哈希表,通常有兩種方法來計算bucket_index:被選擇
- 數桶的是2的冪:散列計算,那麼一些用提取其較低/較高位的位操作。這種方法需要一個「好的」散列函數,其中每個位都是隨機的
- 桶的數量被選爲質數:計算散列,然後用模操作計算bucket_index。此方法不需要「太好」散列函數
對於方法1.如果散列函數質量不好,可能會發生很多衝突。對於方法2,即使使用質量不太好的散列函數,碰撞通常也很少見。但是,方法1通常更快,因爲比特操作比mod更快(但是有技術可以使它更快),並且足夠好的質量哈希函數通常很便宜。
許多哈希表的構建足夠通用,以支持許多不同的哈希函數,因此大多數哈希函數不會「計算」哈希函數的範圍與存儲區數量之間的對應關係。
然而,桶的數量依賴於哈希表的內部結構(衝突解決技術等),尤其是在這個值爲load factor的值上,並且當達到負載因子限制時,實現通常會增加桶的數量由預定的常數因子決定。
你應該尋找更多的進入std::unordered_map接口和玩以下功能,以瞭解更多
http://en.cppreference.com/w/cpp/container/unordered_map/max_bucket_count http://en.cppreference.com/w/cpp/container/unordered_map/bucket_count http://en.cppreference.com/w/cpp/container/unordered_map/bucket_size http://en.cppreference.com/w/cpp/container/unordered_map/load_factor
@downvoter爲什麼downvote?考慮留下評論來解釋你的downvote – Curious
我想,因爲沒有給出問題的答案。什麼意思沒有計算。如果沒有核心響應,那麼我們不知道在哪個桶中放置具有給定散列的元素。 –
- 1. java中散列表桶的大小是多少?
- 2. 最小系列的散列函數
- 3. 整數序列的散列函數
- 4. Perl:散列中數組的大小,在另一個散列
- 5. 數組大小爲可伸縮散列
- 6. 散列函數
- 7. 無法列出桶的內容
- 8. 保留最小完美散列函數的順序
- 9. 陣列大小爲600且散列最少的散列碼
- 10. 何時對無序關聯容器進行重新散列?
- 11. 奇數/素數桶的可變範圍字符串散列函數
- 12. 生成的MD5散列的大小
- 13. 無法理解這個散列函數
- 14. 用戶定義的無序映射散列函數
- 15. 族序號爲大小爲X的桶的至少數
- 16. 問題的散列函數:散列(1)==散列(1.0)
- 17. 散列函數.NET
- 18. MD5散列函數
- 19. 雙散列給出一個大於表大小的數字
- 20. 初始化散列表的大小
- 21. 返回散列表的大小?
- 22. 有限大小的散列表?
- 23. 關於散列值大小的錯誤
- 24. 如何選擇散列表的大小?
- 25. 卡在散列表的大小加倍
- 26. 什麼散列函數應該散列一個有序的數字列表?
- 27. 存儲桶實例的散列鍵
- 28. unordered_set的散列函數
- 29. unordered_set中的散列函數
- 30. 好的散列函數
爲什麼要創建自己的散列容器?這是一個學校或類似的任務嗎?因爲否則你應該使用['std :: unordered_map'](http://en.cppreference.com/w/cpp/container/unordered_map)。 –
我不想創建自己的。我想知道std :: unordered_map的工作原理。正如我所寫的那樣,理論上這可能會對性能產生重大影響。 –