哈希表O(1)摊销或O(1)平均摊销?

时间:2017-09-04 20:53:11

标签: hash big-o hashtable

这个问题可能看起来有点迂腐,但我一直在努力深入研究摊销分析,并且为了为什么哈希表的插入是O(1)摊销而有点困惑。(注意:我不是在谈论表加倍,我明白了)

使用此定义,“摊销分析给出了最坏情况下每项操作的平均性能(随着时间的推移)。”似乎N插入哈希表的最坏情况会导致每个操作发生冲突。我相信当负载平衡保持较低时,通用散列可以保证以1 / m的速率发生冲突,但理论上是不是每次插入都可能发生碰撞?

从技术上讲,哈希表插入的 平均摊销分析似乎是O(1)。

编辑:您可以假设散列表使用基本链接,其中元素放置在相应链接列表的末尾。我问题的真正含义是对概率算法的摊销分析。

编辑2:  我在quicksort上发现this帖子, “在摊销的运行时间和预期的运行时间之间存在微妙但重要的差异。具有随机枢轴的Quicksort需要O(n log n)预期运行时间,但其最坏情况运行时间为Θ(n ^ 2)。这意味着因为快速排序费用很小(n ^ 2)美元的可能性很小,但随着n变大,这种情况发生的可能性会接近零。“我想这可能回答了我的问题。

1 个答案:

答案 0 :(得分:0)

理论上你可以在每次插入时获得冲突,但这意味着你的表现不佳的散列函数无法在键的“桶”之间分隔出值。一个理论上完美的散列函数总是会将一个新值放入一个新的桶中,这样每个键都会引用它自己的桶。 (我假设一个链式哈希表,并将链字段称为“桶”,就像我被教导的那样)。理论上最坏情况的函数会将所有键都粘贴到同一个桶中,从而导致长度为N的桶中的链。

摊销背后的想法是,如果给出一个相当好的散列函数,你应该最终得到插入的线性时间,因为插入的次数> O(1)与插入简单的次数和O(1)相比会大大相形见绌。这并不是说插入没有任何计算(哈希函数仍然需要计算,在某些特殊情况下,哈希函数可能比只查看列表更重要)。

在一天结束时,这带来了一个关于big-O的重要概念,即在计算时间复杂度时,您需要查看最常执行的操作。在这种情况下,插入的值不会与另一个哈希冲突。