为什么 LinkedList 作为 HashMap 的桶实现而不是另一个 Hashmap?
Why LinkedList as a bucket implementation for HashMap and not another Hashmap?
有谁知道为什么选择通过 LinkedList 而不是另一个 Hashmap 来实现 HashMap 的桶。如果桶本身变成 HashMap,似乎包含或获取将是 O(1) 而不是分期 O(1)。
如果在另一个 HashMap 中将它们实现为桶,HashMap 的摊销时间仍为 O(1)。假设两个字符串被散列到 HashMap 内部数据结构中的相同索引。如果该索引包含另一个 HashMap,则这两个字符串将再次散列到相同的索引,但也在桶 HashMap 中。然后你必须决定如何处理桶 HashMap 中的冲突。因此,将 HashMap 用作桶来实现 HashMap 会产生两次冲突,而不是一次。此外,对于一组给定的数据,HashMap 比 LinkedList 使用更多的内存。它们需要比数据条目更多的内存槽来保证分摊的 O(1) 运行时间。
是的,LinkedLists 不是桶的理想选择,因为根据桶的大小需要 O(n) 时间来检索正确的值。 LinkedList 桶不应该变得非常大,因为 HashMap 应该足够大,冲突的频率是最小的。
假设桶是使用 HashMap 实现的,然后有很多冲突。一个好的散列函数应该尽量消除冲突,但我们考虑的是非常多的元素。冲突现在将存储在存储桶的 HashMap 实现中。这个 HashMap 应该有 space 来保存它自己的桶。如果元素数量如此之多以至于这个 HashMap 在它的桶中也有几次碰撞怎么办?即使有一个非常好的散列函数,在线下的某个地方,桶 HashMap 的桶(例如 B)将开始干扰 HashMap A 的桶,它有几个桶,其中一个由 B 实现。
LinkedList不会有这个问题。还请记住,一旦将存储桶分配给 HashMap,它就是对外部阻塞的内存——即使它是空的。 LinkedList 将动态增长,并且不需要比条目数更多的内存。
总而言之,你当然可以实现任何你想要的。您可以使用 ArrayList 或仅使用数组。但它们也有自己的问题(删除会导致 O(n) 调整时间复杂度,并且数组必须具有固定大小)。因此,考虑到所有权衡,LinkedList 被发现是最好的选择。
有谁知道为什么选择通过 LinkedList 而不是另一个 Hashmap 来实现 HashMap 的桶。如果桶本身变成 HashMap,似乎包含或获取将是 O(1) 而不是分期 O(1)。
如果在另一个 HashMap 中将它们实现为桶,HashMap 的摊销时间仍为 O(1)。假设两个字符串被散列到 HashMap 内部数据结构中的相同索引。如果该索引包含另一个 HashMap,则这两个字符串将再次散列到相同的索引,但也在桶 HashMap 中。然后你必须决定如何处理桶 HashMap 中的冲突。因此,将 HashMap 用作桶来实现 HashMap 会产生两次冲突,而不是一次。此外,对于一组给定的数据,HashMap 比 LinkedList 使用更多的内存。它们需要比数据条目更多的内存槽来保证分摊的 O(1) 运行时间。
是的,LinkedLists 不是桶的理想选择,因为根据桶的大小需要 O(n) 时间来检索正确的值。 LinkedList 桶不应该变得非常大,因为 HashMap 应该足够大,冲突的频率是最小的。
假设桶是使用 HashMap 实现的,然后有很多冲突。一个好的散列函数应该尽量消除冲突,但我们考虑的是非常多的元素。冲突现在将存储在存储桶的 HashMap 实现中。这个 HashMap 应该有 space 来保存它自己的桶。如果元素数量如此之多以至于这个 HashMap 在它的桶中也有几次碰撞怎么办?即使有一个非常好的散列函数,在线下的某个地方,桶 HashMap 的桶(例如 B)将开始干扰 HashMap A 的桶,它有几个桶,其中一个由 B 实现。
LinkedList不会有这个问题。还请记住,一旦将存储桶分配给 HashMap,它就是对外部阻塞的内存——即使它是空的。 LinkedList 将动态增长,并且不需要比条目数更多的内存。
总而言之,你当然可以实现任何你想要的。您可以使用 ArrayList 或仅使用数组。但它们也有自己的问题(删除会导致 O(n) 调整时间复杂度,并且数组必须具有固定大小)。因此,考虑到所有权衡,LinkedList 被发现是最好的选择。