Data structures HashMap/HashTable-将冲突添加到bucket的末尾或开始或结束?

Data structures HashMap/HashTable-将冲突添加到bucket的末尾或开始或结束?,data-structures,hashmap,language-agnostic,hashtable,Data Structures,Hashmap,Language Agnostic,Hashtable,如果我有一个HashMap/HashTable并插入键:cValue: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]

如果我有一个HashMap/HashTable并插入键:
c
Value:
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)还是在链接列表的前面插入

如果我在每个bucket的前面插入新的冲突,那么我就不需要在整个LinkedList链上循环。这使得插入
O(1)
,因为无论bucket有多大,我都不需要在所有元素上循环

如果我在每个bucket的末尾插入新的碰撞,我必须循环整个singley列表,直到到达最后一个元素。然后我附加最后一个元素

无论我选择哪一个,从列表中检索都是一样的。我可能仍然需要循环一个bucket中的所有节点。除非您认为用户更有可能在先前添加的
键上调用
get()


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

做这件事没有一个明确的正确或错误的方法。如果使用哈希表表示集合或映射,则无论如何都必须扫描整个bucket,以确定是否插入了重复的元素,因此在开始和结束时插入的成本可能是相同的。而且,由于哈希表可能不会有非常满的存储桶,因此查找成本的相对差异可能不会太大


我会选择最简单的方法。

哦,等等,你说得对,你必须在末尾插入,因为只有在循环到末尾之后才能确定你是否有重复的元素。如果在前面插入,则可能会意外插入副本。非常感谢,如果你愿意的话,你也可以在扫描完列表后在开头插入。可能更容易编写代码。:-)是的,我想是的。无论如何,谢谢你说得清楚。真不敢相信我没意识到这能回答你的问题吗?