2008-11-13 62 views

回答

9

它取決於加載因子(表格將增加其大小並重新分配其元素的「完整百分比」點)。如果您知道您有1000個條目,並且該數字永遠不會更改,您可以將負載因子設置爲1.0,並將初始大小設置爲1000以獲得最大效率。如果您不確定具體的尺寸,則可以將載入係數保留爲其默認值0.75,並將初始尺寸設置爲1334(預計尺寸/ LF),這對於真正的性能良好,但需要額外的內存。

您可以使用下面的構造函數來設置負載係數:

Hashtable(int initialCapacity, float loadFactor) 
+0

假設散列函數在期望的鍵集上表現良好。家庭釀造的散列函數在最小尺寸的表中可能表現不佳。對於家庭釀造的功能,您必須運行實驗。 – 2008-11-13 03:07:03

+0

如果散列函數沒有良好的行爲,碰撞元素將被存儲在同一個桶中(在LinkedList中)。桌子最小尺寸對性能沒有任何影響。 – 2008-11-13 03:12:33

3

這些因素的文檔中的一些討論,你需要在散列函數因素爲好。

一條經驗法則建議將表格大小增加一倍,以便有擴展空間,並希望保持較小的碰撞次數。

另一個經驗法則是假設你正在進行某種與模相關的散列,然後將你的表大小舍入到下一個最大的素數,然後使用該素數作爲模數值。

你有什麼樣的哈希?更多細節應該產生更好的建議。

0

兩次是好的。

您沒有大的鍵組。 不要擔心有關您的HashTable實施的困難討論,並去2000年。

+0

2000並不是一個好的尺寸,因爲它不是素數。 2001年會很好,這不是主要的,但至少不會。將表中的密鑰分配得更好。一個好的散列表會照顧好散列函數,但大多數情況下都會使用這個散列表的大小。 – ReneS 2008-11-14 19:21:34

1

讓它成長。有了這個尺寸,自動處理就好了。除此之外,2 x大小+ 1是一個簡單的公式。素數也是一種很好的方式,但只要您的數據集達到一定的大小,哈希實現可能會決定重新哈希和增長表。

你的鑰匙正在推動有效性,並希望有足夠的分明。

底線:如果您遇到問題(例如尺寸或性能下降),請詢問尺寸問題,除此之外:別擔心!

0

我想重申一下上面說的https://stackoverflow.com/users/33229/wwwflickrcomphotosrene-germany。 1000對我來說似乎不是一個非常大的散列。我一直在java中使用大量有關這種大小的哈希表,而沒有看到很多性能問題。而且我幾乎不知道大小或負載係數。

如果你已經在你的代碼上運行一個分析器並確定哈希表是你的問題,那麼通過一切手段開始調整。否則,在你確定之前,我不會認爲你有問題。

畢竟,在大多數代碼中,性能問題不在您認爲的地方。我儘量不要預期。