当Hashmap的哈希码始终相等时,Hashmap的最坏情况时间复杂度是多少。
在我的理解中:由于每个密钥都具有相同的哈希码,因此它将始终转到同一个桶并循环通过它来检查equals方法,因此对于get和put,时间复杂度应为O(n),我是否正确?
我正在看这个HashMap get/put complexity,但它没有回答我的问题。
同样在这里Wiki Hash Table他们说明插入的最坏情况时间复杂度是 O(1),而对于获取O(n),为什么会这样呢?
答案 0 :(得分:9)
是的,在最糟糕的情况下,您的哈希映射将退化为链接列表,您将遭受查询以及插入和删除的O(N)惩罚,这两者都需要查找操作(感谢评论)在我之前的回答中指出错误。)
有一些方法可以减轻最坏情况的行为,例如通过使用自平衡树而不是链表来实现存储桶溢出 - 这可以将最坏情况的行为减少到O(logn)而不是O( n)中。
答案 1 :(得分:1)
答案 2 :(得分:0)
在open hashing中,您将拥有一个链接列表来存储具有相同哈希码的对象。所以: 例如,您有一个大小为4的散列表。 1)假设您要存储hashcode = 0的对象。然后将对象映射到index(0 mod 4 =)0。 2)然后你再次想要使用hashcode = 8放置另一个对象。这个对象将被映射到索引(8 mod 4 =)0,因为我们记得索引0已经填充了我们的第一个对象,所以我们必须把第二个旁边的第二个。
[0]=>linkedList{object1, object2}
[1]=>null
[2]=>null
[3]=>null
3)搜索的步骤是什么? 1,你必须散列关键对象,并假设它的hashcode是8,所以你将被重定向到index(8 mod 4 =)0,然后因为在同一个索引中存储了多个对象,我们必须搜索逐个列出所有存储的对象,直到找到匹配的对象或直到列表的末尾。因为该示例有2个对象存储在相同的哈希表索引0中,并且搜索到的对象位于链表的末尾,因此您需要遍历所有存储的对象。这就是为什么O(n)是最坏的情况。 当所有存储对象都在哈希表中的相同索引中时发生最坏情况。因此它们将被存储在一个链表中,我们可能需要遍历所有链接列表以查找我们搜索到的对象。
希望这有帮助,答案 3 :(得分:0)
具有地图复杂度
Best. Avg. Worst
Search O(1) O(1) O(n)
Insert O(1) O(1) O(n)
Delete O(1) O(1) O(n)
希望会有所帮助
答案 4 :(得分:-6)
插入时,放入桶中的 无关紧要,因此您可以将其插入任何位置,因此插入是O(1)。< / p>
查找是O(n)因为你必须遍历每个对象并验证它是你正在寻找的那个(如你所说)。