信中的权利要求为二进制堆Wikipedia页面是插入是O(日志 Ñ 平均)在最坏的情况下,但O(1):
所需的操作数仅取决于新元素为满足堆属性而必须升高的级别数,因此,插入操作的最坏情况时间复杂度为O(log n ),但平均情况下复杂度为O(1 )。
该链接页面试图证明这个如下:
但是,平均而言,新插入的元素不会沿着树移动得很远。特别是,假设密钥分布均匀,则它有比父密钥大一半的机会;考虑到它比其祖父母更大,它有比其祖父母更大的一半的机会;daccess- ods.un.org daccess- ods.un.org考虑到其祖父母大于其祖父母,它有一半的机会大于其祖父母,依此类推,因此在一般情况下,插入需要固定的时间
当然这是胡说八道吗?在我看来,如果树是随机排序的,那么新元素比其父元素大的可能性就为50/50。但是,由于粗略地说,大元素沉入了底部,因此随着堆的增长,机会远小于50/50。
那正确吗?
维基百科上已经有好几个月了…
关于平均时间堆插入为O(1)的说法有一个更好的参考:Hayward&McDiarmid 在1991年发表的论文“ 通过重复插入进行堆构建的平均案例分析 ”。(本文链接到Wikipedia文章的当前参考文献4中。)该文献又引用了Porter&Simon在1975年发表的一篇论文,“ 随机插入优先级队列结构 ”,该结构处理了对堆的单次插入,以及证明平均情况为O(1)。
直观地讲,论点很简单。堆的一半是叶子,叶子往往更大。如果我们暂时假设叶子是堆中最大的元素(而不是趋于变大),那么我们可以说一个新元素将成为叶子的概率-即,它在上半部分值范围的- 恰好是0.5。如果新元素不是堆的叶子(概率也为0.5),我们可以使用仅由原始堆中的非叶子节点组成的截短的堆重复该过程,因此新元素位于第二个元素的概率为- 最低水平将是剩余水平的一半:0.25。因此,它处于第三级的可能性为0.125,依此类推。然后,我们必须搜索的预期级别数将为1 * 0.5 + 2 * 0.25 + 3 * 0.125 …,即2。
当然,随机的新元素大于随机的第二级父元素的概率并不是真正的0.5;实际上少了一点。但是,只要它以常数为界,则计算 期望 比较次数的幂级数之和仍将以常数为界。事实证明,该常数约为2.6。
还可以看到这个有用的答案,在讨论堆的复杂性并将它们与BST的复杂性进行对比时,可以对堆中恒定的平均插入时间进行详细的图形分析。