Hash 为什么是hastable';在最坏的情况下,s的再灰化复杂性可能是二次的

Hash 为什么是hastable';在最坏的情况下,s的再灰化复杂性可能是二次的,hash,stl,hashset,unordered-set,Hash,Stl,Hashset,Unordered Set,我不明白为什么hastable的再灰化复杂性在最坏的情况下可能是二次的: 任何帮助都将不胜感激 谢谢只是一些基本知识: 哈希冲突是指两个或多个元素采用相同的哈希。这可能导致最坏情况下的O(n)操作 我不会再深入讨论这个问题了,因为人们可以找到很多解释。基本上所有元素都可以有相同的散列,因此在该散列中有一个包含所有元素的大链表(当然,在链表上搜索是O(n)) 它不必是链表,但大多数实现都是这样做的 再哈希创建一个具有所需大小的新哈希表,并基本上为旧表中的每个元素进行插入(可能有更好的方法,但我相

我不明白为什么hastable的再灰化复杂性在最坏的情况下可能是二次的:

任何帮助都将不胜感激

谢谢

只是一些基本知识:

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

    我不会再深入讨论这个问题了,因为人们可以找到很多解释。基本上所有元素都可以有相同的散列,因此在该散列中有一个包含所有元素的大链表(当然,在链表上搜索是
    O(n)

    它不必是链表,但大多数实现都是这样做的

  • 再哈希创建一个具有所需大小的新哈希表,并基本上为旧表中的每个元素进行插入(可能有更好的方法,但我相信大多数实现都无法克服简单插入的渐进最坏情况复杂性)

  • 除上述内容外,所有这些都归结为以下陈述:(从1开始)

    具有等效值的元素被分组在同一个bucket中,并且以这样的方式迭代器(参见equal_range)可以通过所有元素进行迭代

    因此,所有具有等效值的元素都需要分组在一起。要保持此状态,在执行插入时,首先必须检查是否存在具有相同值的其他元素。考虑所有的值都采用相同的哈希值的情况。在这种情况下,您必须查看上述链接列表中的这些元素。所以
    n
    插入,查看
    0
    ,然后
    1
    ,然后
    2
    ,然后…,然后
    n-1
    元素,即
    0+1+2+…+n-1
    =
    n*(n-1)/2
    =
    O(n2)

    您不能将其优化为
    O(n)
    ?对我来说,您可以这样做是有道理的,但即使如此,这并不意味着所有实现都必须这样做。当使用哈希表时,通常假定不会有太多的冲突(即使这种假设是幼稚的),从而避免了最坏情况下的复杂性,从而减少了对额外复杂性的需要,从而避免了重复使用
    O(n2)


    1:对于所有可能的仇恨者,很抱歉引用而不是(对于其他所有人-CPlusPlus众所周知是错误的),但是我在那里找不到这个信息(因此,当然,它可能是错误的,但我希望不是,在这种情况下它确实有意义)。

    因为散列冲突。