HashMap / HashTable - 在桶末或开头或结尾添加冲突?

时间:2017-03-13 23:32:30

标签: data-structures hashmap language-agnostic hashtable

如果我有HashMap / HashTable并插入密钥:c值:14

[0] -> NULL
[1] -> NULL
[2] -> NULL
[3] -> NULL
[4] -> NULL
[5] -> NULL
[6] -> NULL
[7] -> NULL
[8] -> NULL
[9] -> (c/14) -> NULL
[0] -> NULL
[1] -> NULL
[2] -> NULL
[3] -> NULL
[4] -> NULL
[5] -> NULL

我们说我插入密钥:z值:6,哈希和模数使其落在索引9上。

我的问题是:我是否在单链表(意为(c/14) -> (z/6) -> NULL)的末尾或在LinkedList的前面插入。

如果我在每个存储桶的前面插入新的冲突,那么我就不需要遍历整个LinkedList链。这使得插入O(1),因为无论铲斗有多大,我都不需要遍历所有元素。

如果我在每个桶的末尾插入新的碰撞,我必须遍历整个单一列表,直到我到达最后一个元素。然后我追加最后一个元素。

无论我选择哪一个,从List中检索都是一样的。我可能仍然需要遍历存储桶中的所有节点。除非您认为用户更有可能在之前添加的get()上拨打key

尽管如此,我看到HashTable和HashMap的所有示例和实现都在桶的末尾添加了元素。为什么呢?

1 个答案:

答案 0 :(得分:1)

没有明确的正确或错误的方法来做到这一点。如果您的哈希表用于表示集合或地图,您无论如何都必须扫描整个存储桶,以确定您是否正在插入重复元素,因此在开始时插入的成本最后可能会完全相同。并且,由于哈希表可能不会有非常满的桶,因此查找成本的相对差异可能不会太高。

我只是选择最简单的方式。