2017-03-13 31 views
0

如果我有一个HashMap/Hashtable和我插入钥匙:c值:14HashMap/HashTable - 将冲突添加到桶的结尾还是开始或结束?

[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),因为无论存储桶有多大,我都不需要遍历所有元素。

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

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

尽管如此,我看到HashTable和HashMap的所有示例和实现都将元素添加到存储区末尾。为什么?

回答

1

有没有一个明确的正确或错误的方式来做到这一点。如果使用散列表来表示一个集合或一个映射,那么您必须扫描整个存储区以查明您是否插入了重复元素,因此在开始和结束处插入代码将可能是相同的。而且,由于哈希表可能不会有非常满的桶,因此查找成本的相对差异可能不会太高。

我只是去任何最简单的。

+1

哦等待你是对的,你必须在最后插入,因为只有在循环到最后才能确定是否有重复元素。如果您在前面插入,可能会意外插入重复。非常感谢。 – Hatefiend

+0

如果需要,您也可以在扫描完列表后插入。编码可能会更容易一些。 :-) – templatetypedef

+0

是的,我猜是的。不管怎样,谢谢你明确表示。简直不敢相信我没有意识到 – Hatefiend

相关问题