我正在一家着名的搜索公司读到这个人的采访。
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相互作用吗?
答案 0 :(得分:4)
我会冒险他完全错了。 BOUNDS应该是桶的数量,或者最后几个桶将未被充分利用。
此外,输出到桶数的边界应该是哈希函数的外部。这是该特定哈希表的实现细节。你可能有一个非常大的表使用大量的桶而另一个使用很少的桶。两者都应该共享相同的字符串 - >哈希函数
此外,如果您阅读链接到它的页面非常有趣。我本可以将他的哈希表实现为10,000个桶 - 对于那些没有读过它的人来说,文章建议~4,000,000,000个存储桶来存储1,000,000个左右的桶。对于冲突,每个桶都有一个单词结构向量,每个单词结构包含一个计数,一个明文字符串和一个哈希(在桶中是唯一的)。这将使用更少的内存并更好地使用现代缓存,因为您的工作集会小得多。
为了进一步减少内存使用量,您可以尝试在输入阶段从哈希中剔除单词,看起来它们基于当前计数低于前100,000。
答案 1 :(得分:0)
我曾在一家知名搜索公司接受采访。我得到了完全相同的问题。我尝试使用哈希表解决它。
我从那次采访中了解到的一件事是,在一家知名的搜索公司,你不建议使用哈希作为解决方案。你使用任何你喜欢的树状结构,但你总是使用有序结构,而不是哈希表。
答案 2 :(得分:0)
一个简单的显式后缀树只能使用最坏情况下的500k内存(具有中等效率的实现,4字节字符编码和相对较长的英文单词,具有最小的重叠)来做同样的事情。
我认为文章中的那个人超越了自己。