我讀過一本書,如果一個散列函數爲每個不同的對象返回唯一的散列值,它是最有效的。如果類中的hashcode()方法爲每個不同的對象提供了一個唯一的哈希值,並且我想將該類中的n個不同的實例存儲在一個Hashmap中,那麼將有n個存儲區用於存儲n個實例。時間複雜度爲O N)。那麼每個散列值的單個條目(實例)如何產生更好的性能?它是否與存儲桶的數據結構有關?每個存儲桶中的單個實例如何在java Hashmap中產生最佳性能?
回答
你似乎認爲有n buckets for n elements
,時間複雜度將是O(n)
,這是錯誤的。
不同的例子,假設你有一個ArrayList
有n個元素,需要多少時間來執行get(index)
例如? O(1)
對不對?
現在想想HashMap
,這指數在ArrayList
例子實際上是hashCode
的地圖。當我們插入一個HashMap來查找該元素到達的位置(存儲桶)時,我們使用散列碼(索引)。如果每個桶有條目 - 地圖上的值的搜索時間爲O(1)
。
但即使有多個值在一個水桶,一個HashMap中的一般搜索的複雜性仍然是O(1)
。
存儲桶的數據結構也很重要。例如,對於更糟糕的情況。在目前實施的HashMap
中,它使用兩種類型:LinkedNode
和TreeNode
;取決於一些事情,比如在這個時間點有多少桶。鏈接很簡單:
next.next.next...
樹節點是
- left
node
- right
這是一個red-black
樹。在這樣的數據結構中,搜索複雜度是O(logn)
,這比O(n)
好得多。
Java HashMap將Key k與Value關聯起來v每個Java Object都有一個方法hashCode(),它產生一個不一定唯一的整數。
我讀過一本書,如果一個散列函數爲每個不同的對象返回唯一的散列值,它是最有效的。
另一個定義是最好的散列函數是產生最小衝突的散列函數。
如果哈希碼()的一類方法給出了每個不同對象的唯一的散列值和予想存儲在一個HashMap該類的n個不同的情況下,那麼將有N個區段用於存儲N個instances.The時間複雜度將是O(n)。
在我們的案例中,HashMap包含一個具有一定大小的桶的表,比方說我們的目的> = n。它使用對象的hashCode作爲關鍵字,並通過Hash函數返回表的索引。如果我們有n個對象,並且哈希函數返回n個不同的索引,我們就有0個碰撞。這是最佳情況,找到並獲取任何對象的複雜度是O(1)。
現在,如果哈希函數爲2個不同的鍵(對象)返回相同的索引,那麼我們發生衝突,並且該索引上的表桶已經包含一個值。在這種情況下,表桶將指向另一個新分配的桶。按照該順序,在發生碰撞的索引上創建一個列表。所以最壞情況下的複雜度將是O(m),其中m是最大列表的大小。
總之,HashMap的性能取決於碰撞的次數。越少越好。
我相信這個video會幫助你。
- 1. 存儲桶實例的散列鍵
- 2. 備份s3存儲桶最佳實踐
- 3. 可能存儲一個HashMap在ServletContext中?
- 4. HashMap存儲桶中的條目數
- 5. Java HashMap重複存儲桶條目
- 6. 爲池中的每個Cognito身份提供單個S3存儲桶的最佳方式
- 7. Java HashMap在內部存儲在不同桶中
- 8. HashMap只存儲每個鍵的最後一個值
- 9. EC2實例的最佳存儲結構?
- 10. 在SQL Server中存儲(產品)屬性的最佳模式
- 11. 存儲庫模式的最佳實踐 - 每個表的回購?
- 12. 生產中image_path的性能不佳
- 13. java 8 HashMap存儲桶中使用哪種樹型?
- 14. 如何在HashMap中存儲同一個鍵的多個值?
- 15. 如何使用java爲存儲桶中的單個文件設置權限
- 16. java中單實例類的最佳實踐是什麼?
- 17. UUIDgenerate()與一個s4類在每個實例中產生相同的uuid
- 18. 在java的另一個類中存儲類的實例
- 19. 將多個數據類型存儲在單個HashMap中
- 20. 將庫存存儲在數據庫中的最佳方式:每個物品實例獲取其列表,或者每個玩家都有一個「庫存」字段?
- 21. HashMap可能存在哪個不同的桶索引?
- 22. 檢查s3存儲桶中是否存在單個對象?
- 23. Java的如何獲取存儲在一個HashMap
- 24. C#如何將一個類的實例存儲在列表中
- 25. Java三個屬性,最佳存儲方式+排序
- 26. 簡單mod_rewrite的,在每一個實例
- 27. ElasticSearch從總數中計算每個存儲桶的百分比
- 28. 如何在hashmap中存儲bytearrays或在java中hashtable
- 29. mysql在單個表格中選擇每個類別的最佳
- 30. 如何將多個值存儲在單個屬性中
不一定正確。例如,如果每個散列碼碰巧是32的不同倍數,那麼在大小爲32的散列映射中這將是非常低效的。 –