为什么哈希表使用数组上的链表来存储桶?

时间:2012-11-28 00:31:47

标签: arrays linked-list hashtable

当值被散列为相同值时,它将被添加到散列值引用的链接列表中。为什么哈希表的实现使用数组上的链表作为存储桶?

是因为数组在初始化时具有预定的大小,所以当将太多元素添加到存储桶时需要调整大小?

2 个答案:

答案 0 :(得分:4)

是:通常,这是因为数组具有预定大小。没有要求您使用链表或数组作为存储桶;一些狡猾的实现使用另一个哈希表,然后使用链表或数组作为其桶!

如果使用数组,则哈希表具有每个数组元素的预定大小。每个可能的存储桶都已分配,您的哈希表可能非常大。如果你有很多内存,或者你期望一个非常完整的哈希表,那可能没问题。您可以通过按住指向数组的指针并根据需要进行分配来缓解这种情况。

可以对数组建立索引,因此您可以对数组进行排序。然后,如果它变大,你可以进行二进制搜索以找到你想要的密钥。

如果您使用链接列表,则必须遍历链接列表以找到线性匹配的匹配项。这不是太有效,但它最大限度地减少了内存使用。

与所有数据结构问题一样,您必须考虑您将拥有的访问模式以及您将如何使用和填充结构;你想赢得什么样的权衡,哪些是你不太关心的?

答案 1 :(得分:3)

他们没有。

声称“哈希表的实现”使用链表是一种过于概括的说法。 Java确实如此。许多其他语言没有。例如,Python使用开放散列,请参阅此问题的答案How are Python's Built In Dictionaries Implemented

通常,通用API的设计者面临着非常艰难的选择,因为他们不了解用户的用例。有不同的实现选择有不同的权衡,例如,如果您只添加元素但从不删除,则不同的选择适用于经常变异的hashmap。等等。