2013-10-14 14 views
0

我有8000個鍵/值對。我讀到的散列速度是O(1),但碰撞的關鍵,它將成爲O(n)其中n是日誌(項目編號),請糾正我,如果我的觀念是錯誤的。使用兩個哈希表的java比一個好?

然後我想如果我使用多個表,比如說把hashtable1中的1到3000,hashtable1中的3001到6000,那麼性能應該有更高的機會到2 * O(1)?此外,如何確定表1,2等的最佳尺寸?

另外,我讀帖子,如果我不使用多線程訪問哈希映射使用哈希映射更好?這是真的嗎?

+1

在事實證明它是剖析器的瓶頸之前,不要推翻事物,因此對於所有密鑰使用單個映射。是的,使用'HashMap'而不是'Hashtable'類。 –

+0

您可以事先計算出確切的數量(或足夠接近的數值)或條目(並相應地設置大小+負載因子),以確定最佳大小。當然這是相當直接的.. –

+0

我想是的,但我想知道這個概念的思想是否正確?謝謝! – manhon

回答

1

碰撞的概率僅取決於元素數量和HashTable大小之間的比例。

你可以指定一個初始值,如果你不指定,Java會爲你處理這個問題。

是的,如果您沒有併發訪問,請使用HashMap,因爲您不會有額外的同步數據結構負擔。

+0

你也可以指定一個加載因子,所以你可以調整哈希表,如果它的性能不足以滿足你的需求。儘管通常它也可能是密鑰的糟糕散列函數。 – Joey

+0

讓我們說10個項目,其中3個散列之後會變成同樣的關鍵,這會破壞散列表的性能,即使比例很小?謝謝 – manhon

+0

@manhon如果他們都有相同的密鑰,看起來更像是你的哈希方法中的一個問題。 –

0

你在第一句話中回答了你自己的問題:我讀到散列速度是O(1),但碰撞密鑰

如果作爲鍵的對象屬於您所寫的類,那麼您可以完全控制如何計算hashCode()。使用單個地圖並實施hashCode(),以避免碰撞。

如果您不控制hashCode()的運行方式,您仍然可以編寫一個包裝關鍵對象併爲其計算自己的散列碼的類 - 而且結果比使用多個映射的結果更易於閱讀。

多重映射方法是一種破解 - 由於哈希碰撞導致的性能問題非常罕見 - 在大多數應用程序中,優化I/O和諸如此類的事情比這種微型優化付出的代價更大。所以通常更好的目標是可讀性。