【发布时间】:2013-08-12 10:56:40
【问题描述】:
我不明白为什么 hastable 的 rehash 复杂度在最坏的情况下可能是二次的:
http://www.cplusplus.com/reference/unordered_set/unordered_multiset/reserve/
任何帮助将不胜感激!
谢谢
【问题讨论】:
标签: hash stl hashset unordered-set
我不明白为什么 hastable 的 rehash 复杂度在最坏的情况下可能是二次的:
http://www.cplusplus.com/reference/unordered_set/unordered_multiset/reserve/
任何帮助将不胜感激!
谢谢
【问题讨论】:
标签: hash stl hashset unordered-set
只是一些基础知识:
哈希冲突是指两个或多个元素采用相同的哈希。这可能会导致最坏情况下的O(n) 操作。
我不会真正深入探讨这一点,因为人们可以找到很多解释。基本上所有元素都可以具有相同的哈希,因此您将在该哈希处拥有一个包含所有元素的大链表(在链表上搜索当然是O(n))。
它必须是一个链表,但大多数实现都是这样的。
除此之外,这一切都归结为这句话:(来自here1)
具有等效值的元素被组合在同一个桶中,并且迭代器(参见 equal_range)可以遍历所有元素。
因此,所有具有相同值的元素都需要组合在一起。为此,在进行插入时,您首先必须检查是否存在具有相同值的其他元素。考虑所有值都采用相同哈希的情况。在这种情况下,您必须查看上述链接列表中的这些元素。所以n 插入,查看0,然后是1,然后是2,然后......,然后是n-1 元素,即0+1+2+...+n-1 = n*(n-1)/2 = O(n<sup>2</sup>)。
你不能把它优化成O(n)吗?对我来说,你可以这样做是有道理的,但即使是这样,这并不意味着所有实现必须这样做。当使用哈希表时,通常假设不会有太多的冲突(即使这个假设是幼稚的),从而避免了最坏情况的复杂性,从而减少了对额外的复杂性的需要,不需要重新哈希@987654335 @。
1:对于所有可能的仇恨者,很抱歉引用 CPlusPlus 而不是 CPPReference(对于其他所有人 - CPlusPlus 以错误而闻名),但我找不到那里的信息(所以,当然,它可能是错误的,但我希望它不是,并且在这种情况下它确实有意义)。
【讨论】: