我有8000個鍵/值對。我讀到的散列速度是O(1),但碰撞的關鍵,它將成爲O(n)其中n是日誌(項目編號),請糾正我,如果我的觀念是錯誤的。使用兩個哈希表的java比一個好?
然後我想如果我使用多個表,比如說把hashtable1中的1到3000,hashtable1中的3001到6000,那麼性能應該有更高的機會到2 * O(1)?此外,如何確定表1,2等的最佳尺寸?
另外,我讀帖子,如果我不使用多線程訪問哈希映射使用哈希映射更好?這是真的嗎?
我有8000個鍵/值對。我讀到的散列速度是O(1),但碰撞的關鍵,它將成爲O(n)其中n是日誌(項目編號),請糾正我,如果我的觀念是錯誤的。使用兩個哈希表的java比一個好?
然後我想如果我使用多個表,比如說把hashtable1中的1到3000,hashtable1中的3001到6000,那麼性能應該有更高的機會到2 * O(1)?此外,如何確定表1,2等的最佳尺寸?
另外,我讀帖子,如果我不使用多線程訪問哈希映射使用哈希映射更好?這是真的嗎?
你在第一句話中回答了你自己的問題:我讀到散列速度是O(1),但碰撞密鑰。
如果作爲鍵的對象屬於您所寫的類,那麼您可以完全控制如何計算hashCode()
。使用單個地圖並實施hashCode()
,以避免碰撞。
如果您不控制hashCode()
的運行方式,您仍然可以編寫一個包裝關鍵對象併爲其計算自己的散列碼的類 - 而且結果比使用多個映射的結果更易於閱讀。
多重映射方法是一種破解 - 由於哈希碰撞導致的性能問題非常罕見 - 在大多數應用程序中,優化I/O和諸如此類的事情比這種微型優化付出的代價更大。所以通常更好的目標是可讀性。
在事實證明它是剖析器的瓶頸之前,不要推翻事物,因此對於所有密鑰使用單個映射。是的,使用'HashMap'而不是'Hashtable'類。 –
您可以事先計算出確切的數量(或足夠接近的數值)或條目(並相應地設置大小+負載因子),以確定最佳大小。當然這是相當直接的.. –
我想是的,但我想知道這個概念的思想是否正確?謝謝! – manhon