algorithm - 使用动态数组处理哈希表中的冲突

标签 algorithm data-structures linked-list hashtable dynamic-arrays

看看一些哈希表的实现,单独的链接似乎是通过链表或树来处理的。有没有不使用动态数组的原因?我想拥有动态数组也会有更好的缓存性能。然而,由于我还没有看到任何这样的实现,所以我可能遗漏了一些东西。

我错过了什么?

最佳答案

与动态数组相比,链表的一个优点是可以更快地完成重新哈希。不必创建一堆新的动态数组,然后将旧的动态数组中的所有元素复制到新的动态数组中,而是可以将链表中的元素重新分配到新的存储桶中,而无需执行任何分配。

此外,如果负载因子较小,使用链表的空间开销可能会比动态数组的空间开销更好。使用动态数组时,通常需要存储指针、长度和容量。这意味着,如果您有一个空的动态数组,则最终需要两个整数和一个指针的空间,以及预先分配的用于保存元素的空间。在空桶中,与仅存储链表的空指针相比,此空间开销很大。另一方面,如果桶中有大量元素,那么动态数组将更节省空间,并且由于引用的局部性而具有更高的性能。

希望这有帮助!

关于algorithm - 使用动态数组处理哈希表中的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17200324/

相关文章:

algorithm - 未保存更改检测的实现

arrays - 最快算法的大 O 打印长度为 n 的未排序数组和长度为 m 的排序数组之间的公共(public)元素

c++ - 使用后缀数组算法进行 Burrows Wheeler 变换

java - Java中向单链表添加元素

c - 指针ABC。错误: invalid type argument of unary ‘*’ (have ‘struct config’ )

c - 在 C 中将节点添加到链表的末尾

c - 链表: trying to change index of node

algorithm - 分析 1 个可变寄存器指令集?

java - 删除链表中出现多次的每个元素的第一次出现

c++ - If Else 构造