Wikipedia page for binary heaps上的声明是在最坏的情况下插入是O(log n ),但平均为O(1):
所需的操作数量仅取决于新元素必须上升以满足堆属性的级别数,因此插入操作的最坏情况时间复杂度为O(log n )但O(1)的平均情况复杂性。
linked page试图证明这一点如下:
但是,平均而言,新插入的元素不会在树上移动很远。特别是,假设密钥的均匀分布,它有一半的机会大于其父级;鉴于它比其父母更大,它有一半的机会比祖父母更大;它有一半的机会比它的曾祖父母更大,因为它比它的父母更大,等等[...]所以在平均情况下插入需要恒定的时间
但这肯定是胡说八道?在我看来,如果树是随机排序的,那么新元素比其父元素大50/50的可能性;但是,从大致来说,大型元素下沉到底部,随着堆的增长,机会远小于50/50。
是吗?
几个月来维基百科就像这样......
答案 0 :(得分:19)
对于平均时间堆插入为O(1)的声明有一个更好的参考:1991年的论文" Average Case Analysis of Heap Building by Repeated Insertion"海沃德&麦克迪尔米德。 (本文与维基百科文章目前的参考文献4相关联。)该论文反过来引用了波特与伦敦的1975年论文。西蒙," Random insertion into a priority queue structure"它处理堆中的单个插入,并证明平均情况为O(1)。
直观地说,这个论点很简单。堆的一半是叶子,叶子往往更大。如果我们假设叶子是堆中最大的元素(而不是倾向于更大),那么我们可以说新元素将成为叶子的概率 - 即,它在上半部分价值范围 - 恰好是0.5。如果新元素不是堆的叶子(也是概率0.5),我们可以使用仅由原始堆中的非叶节点组成的截断堆重复该过程,因此新元素位于第二个的概率 - 最低水平将是剩余的一半:0.25。因此它处于第三级的概率为0.125,依此类推。那么我们要搜索的预期级别数将是1 * 0.5 + 2 * 0.25 + 3 * 0.125 ...,即2。
当然,随机新元素大于随机二级父元素的概率实际上不是0.5;它实际上少了一点。但是,只要它以常数为界,计算预期比较次数的幂级数的总和仍然会受到常数的限制。事实证明,常数约为2.6。
另见this useful answer,在讨论堆的复杂性时,将它们与BST的复杂性进行对比,给出了堆中恒定平均插入时间的详细图形分析。