散列函数输出是否需要小于桶的数量?

时间:2009-05-13 03:57:38

标签: algorithm hashtable hash

我正在一家着名的搜索公司读到这个人的采访。

http://asserttrue.blogspot.com/2009/05/one-of-toughest-job-interview-questions.html

他被问到一个导致他实现哈希表的问题。他说以下内容:

HASH = INITIAL_VALUE;
FOR EACH ( CHAR IN WORD ) {
HASH *= MAGIC_NUMBER
HASH ^= CHAR
HASH %= BOUNDS
}
RETURN HASH
  我解释了哈希表数组   长度应该是素数,而BOUNDS   数字小于表格长度,   但是相当于桌子的长度。

为什么BOUNDS数量应小于桶数?桌面长度的互相作用是什么?它不应该与BOUNDS相互作用吗?

3 个答案:

答案 0 :(得分:4)

我会冒险他完全错了。 BOUNDS应该是桶的数量,或者最后几个桶将未被充分利用。

此外,输出到桶数的边界应该是哈希函数的外部。这是该特定哈希表的实现细节。你可能有一个非常大的表使用大量的桶而另一个使用很少的桶。两者都应该共享相同的字符串 - >哈希函数

此外,如果您阅读链接到它的页面非常有趣。我本可以将他的哈希表实现为10,000个桶 - 对于那些没有读过它的人来说,文章建议~4,000,000,000个存储桶来存储1,000,000个左右的桶。对于冲突,每个桶都有一个单词结构向量,每个单词结构包含一个计数,一个明文字符串和一个哈希(在桶中是唯一的)。这将使用更少的内存并更好地使用现代缓存,因为您的工作集会小得多。

为了进一步减少内存使用量,您可以尝试在输入阶段从哈希中剔除单词,看起来它们基于当前计数低于前100,000。

答案 1 :(得分:0)

我曾在一家知名搜索公司接受采访。我得到了完全相同的问题。我尝试使用哈希表解决它。

我从那次采访中了解到的一件事是,在一家知名的搜索公司,你不建议使用哈希作为解决方案。你使用任何你喜欢的树状结构,但你总是使用有序结构,而不是哈希表。

答案 2 :(得分:0)

一个简单的显式后缀树只能使用最坏情况下的500k内存(具有中等效率的实现,4字节字符编码和相对较长的英文单词,具有最小的重叠)来做同样的事情。

我认为文章中的那个人超越了自己。