Algorithm 哈希表的数组大小?

Algorithm 哈希表的数组大小?,algorithm,hashtable,hashalgorithm,Algorithm,Hashtable,Hashalgorithm,我正在读一本关于算法的书,以找到更好的替代列表的方法。这本书提到哈希表的数组大小必须是需要添加的项目大小的两倍。但是,在讨论单独链接时,没有提到数组大小。数组大小是否仍然必须是要添加的项的两倍?由于每个索引可以包含多个项目,它是否可以与项目大小相同?这会影响性能吗?这取决于您的内存/速度权衡要求。 对于链接方案,我建议使用哈希表大小为的1/2..1/4 钥匙数量。如果按键对每个链接列表进行排序,则每次查找约1-2次比较 此外,为了提高性能,可以使用屏障元素。这是一个特殊的节点, 包含屏障值,大于

我正在读一本关于算法的书,以找到更好的替代列表的方法。这本书提到哈希表的数组大小必须是需要添加的项目大小的两倍。但是,在讨论单独链接时,没有提到数组大小。数组大小是否仍然必须是要添加的项的两倍?由于每个索引可以包含多个项目,它是否可以与项目大小相同?这会影响性能吗?

这取决于您的内存/速度权衡要求。 对于链接方案,我建议使用哈希表大小为的1/2..1/4 钥匙数量。如果按键对每个链接列表进行排序,则每次查找约1-2次比较

此外,为了提高性能,可以使用屏障元素。这是一个特殊的节点, 包含屏障值,大于所有可能的键, 所有liknkist的最后一个元素都不是空的, 而是到那个障碍节点

这样,您就不需要比较指向is链接列表结尾的指针, 您只需在列表排序时比较键:

for(node *p = table[hash]; p->key < search_key; p = p->next);
return p->key == search_key? p : NULL;

在链接的情况下,与探测相比,哈希表的大小并不重要,但将键映射到存储桶的哈希函数非常重要,因为如果哈希函数不能在表中均匀分布键,那么您可能最终会对元素进行线性搜索。建议使用1,1/2,1/4.等任何尺寸的桌子。。要获得O1搜索和插入,提供的哈希函数必须均匀分布表中的数据。

如果使用单独的链接,则插入/删除/查找将不再是O1,因为您可能需要遍历列表,即链表。因此,表越小,冲突就越多,可能需要遍历的链表也就越多。@C.B.只要数组大小与元素数成线性比例,并且数组的大小经常以指数反比的方式调整,那么查找仍然是O1.For循环,没有实体,这样写,通常会让新程序员感到困惑,有些则不是新程序员。我发现更清楚的是要把;或{}在下一行缩进。