我正在读一本关于算法的书,以找到更好的列表替代品。该书提到哈希表的数组大小必须是需要添加的项目大小的两倍。但是,在讨论单独的链接时,没有提到数组大小。数组大小是否仍然是要添加的项目的两倍?它可以与项目大小相同,因为每个索引可以包含多个项目吗?这会影响性能吗?
答案 0 :(得分:0)
这取决于您的内存/速度权衡要求。 对于链接方案,我建议使用哈希表大小为1 / 2..1 / 4 钥匙数量。如果您按键分类每个链接列表,则每次查找约1-2个比较。
另外,为了提高性能,您可以使用"屏障元素"。这是特殊节点, 包含"屏障值,大于所有可能的键", 所有liknkist的最后一个元素都不是NULL, 但是改为那个障碍节点。
通过这种方式,您不需要比较指针"是链接列表结束", 你只需要比较键(列表已排序):
for(node *p = table[hash]; p->key < search_key; p = p->next);
return p->key == search_key? p : NULL;
答案 1 :(得分:0)
如果链接哈希表大小与探测相比并不重要,但是将键映射到存储桶的哈希函数很重要,因为如果哈希函数不能在表中均匀分布键,那么最终可能会对元素进行线性搜索。建议任何表格大小为O(N),如(1,1 / 2,1 / 4 ..)得到O(1)搜索和插入提供的哈希函数必须在表格中均匀分布数据。