为什么LinkedList作为HashMap的桶实现而不是另一个Hashmap?

时间:2015-04-19 03:04:32

标签: hashmap buckets

有谁知道为什么选择通过LinkedList而不是另一个Hashmap实现HashMaps的存储区。如果桶本身成为HashMaps,似乎包含或得到O(1)并且不摊销O(1)。

2 个答案:

答案 0 :(得分:1)

如果HashMaps在另一个HashMap中实现为存储桶,则仍然会分摊O(1)。让我们说在HashMap的内部数据结构中将两个字符串散列到相同的索引。如果该索引包含另一个HashMap,则两个字符串将再次散列到相同的索引,但在桶HashMap中也是如此。然后你必须决定如何处理桶HashMap中的冲突。因此,使用HashMaps作为存储桶实现HashMap将创建两个冲突而不是一个冲突。此外,与LinkedLists相比,HashMaps对给定数据集使用更多内存。它们需要比数据条目更多的内存插槽,以保证分摊的O(1)运行时间。

是的,LinkedLists不适用于存储桶,因为它需要花费O(n)时间来检索存储桶的大小以获取正确的值。但是,LinkedList桶不应该变得非常大,因为HashMap应该足够大,以至于碰撞的频率最小。

答案 1 :(得分:1)

想象一下,使用HashMap实现存储桶,然后会发生很多冲突。一个好的哈希函数应该尝试消除冲突,但我们正在考虑大量的元素。冲突现在将存储在存储桶的HashMap实现中。这个HashMap应该有空间来容纳它自己的桶。如果有这么大的元素,这个HashMap在它的桶中也会发生多次冲突怎么办?即使有一个非常好的散列函数,在某个地方,存储桶HashMap(例如B)的桶将开始干扰HashMap A的桶,它有几个桶,其中一个由B实现。

LinkedList不会有这个问题。还要记住,一旦将桶分配给HashMap,它就会被阻塞到外部的内存 - 即使它是空的。 LinkedList将动态增长,并且不需要比条目数更多的内存。

总而言之,您当然可以实现您想要的任何内容。您可以使用ArrayList或仅使用数组。但它们也有自己的问题(删除导致O(n)调整时间复杂度,并且数组必须具有固定大小)。因此,考虑到所有权衡,LinkedList被认为是最好的选择。