2011-05-10 82 views
3

如果我有50 000個,並有發言權,10個可用的哈希表。 如果不使用LinkedLists以便數組永遠不會溢出,那麼爲每個索引選擇適當的桶數組大小的最佳方式是什麼?多餘的30%是否合適?哈希表鬥陣

+0

一個就夠了我想,最好的也 – 2011-05-10 10:28:05

回答

0

一些語言支持陣列(無需聲明數組的大小)動態大小。數據決定動態數組的大小。並且需要大小的語言也支持動態數組。

+1

我不知道你在哪裏得到的「大多是」從。當然,在我使用的語言(Java,C#,C,C++)中,數組在創建後的大小是固定的。當一種語言支持通常涉及複製的「動態大小調整」時,所以仍然值得嘗試獲得適當的大小。 – 2011-05-10 10:30:13

+0

在obj-c數組是動態的,我也使用java,c#,c和C++,但沒有使用動態數組的概念,但我想我讀了大學水平的c和C++。當然,我在obj-c工作,這就是爲什麼我給了這種類型的答案。我已經從你的書看到C#,所以我不能說別的任何事情,所以我要刪除主要單詞。 – Ishu 2011-05-10 10:43:59

+0

肯定更好:) – 2011-05-10 10:51:01

0

如果您使用的是固定大小的數組爲你的水桶,再有就是小於50,000沒有桶的大小,可以保證永遠不會溢出,除非你對鍵在50000分佈的附加信息(例如,如果你知道他們是整數1 ... 50,000,那麼它將是微不足道的)。

但一般你不希望依靠大水桶,因爲這是O(n)搜索桶。相反,使用可變大小的表和可變大小的桶是更好的主意。桶可以簡單地是數組,每次填滿時您的大小就會增加一倍。類似地,哈希表的大小每增加90%就可以加倍。這是一種標準類型的方法。由以前的海報提到

爲,無論是通過數組或鏈表列表的大多數實現你當列表已滿自動重新分配存儲。

0

如果您知道密鑰先驗,您可以計算minimal perfect hash。因此,如果你知道密鑰並且可以定製哈希函數,那麼一個桶的大小就足夠了。

如果您事先不知道密鑰 - 或者知道密鑰,但不能改變哈希函數 - 那麼攻擊者可以選擇最差情況下的一組密鑰(即密鑰所有哈希到同一個桶)。爲了保證桶不溢出,你需要一個桶大小等於桶的數量。如果您願意容忍溢出的機會,則可以進行更復雜的分析來選擇涵蓋大多數情況的桶大小。