【问题标题】:why hastable's rehash complexity may be quadratic in worst case为什么 hastable 的 rehash 复杂性在最坏的情况下可能是二次的
【发布时间】:2013-08-12 10:56:40
【问题描述】:

我不明白为什么 hastable 的 rehash 复杂度在最坏的情况下可能是二次的:

http://www.cplusplus.com/reference/unordered_set/unordered_multiset/reserve/

任何帮助将不胜感激!

谢谢

【问题讨论】:

标签: hash stl hashset unordered-set


【解决方案1】:

只是一些基础知识:

  1. 哈希冲突是指两个或多个元素采用相同的哈希。这可能会导致最坏情况下的O(n) 操作。

    我不会真正深入探讨这一点,因为人们可以找到很多解释。基本上所有元素都可以具有相同的哈希,因此您将在该哈希处拥有一个包含所有元素的大链表(在链表上搜索当然是O(n))。

    必须是一个链表,但大多数实现都是这样的。

  2. 1234563简单插入的渐近最坏情况复杂度)。

除此之外,这一切都归结为这句话:(来自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 以错误而闻名),但我找不到那里的信息(所以,当然,它可能是错误的,但我希望它不是,并且在这种情况下它确实有意义)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 2022-01-24
    • 1970-01-01
    • 2021-09-27
    • 2018-12-15
    • 2022-11-17
    • 2014-08-01
    相关资源
    最近更新 更多