Algorithm 堆插入的O(1)平均大小写复杂度的参数

Algorithm 堆插入的O(1)平均大小写复杂度的参数,algorithm,insert,heap,time-complexity,Algorithm,Insert,Heap,Time Complexity,上的声明是,插入在最坏的情况下为O(logn),但平均为O(1): 所需的操作数仅取决于新元素必须提升以满足heap属性的级别数,因此插入操作的最坏情况时间复杂度为O(logn),但平均情况复杂度为O(1) 以下是证明这一点的尝试: 但是,平均而言,新插入的元素不会在树上移动很远。特别是,假设密钥分布均匀,它有一半的几率大于其父级;考虑到它比它的父母更大,它有一半的几率比它的祖父母更大;考虑到它比它的父母更大,它有一半的几率比它的曾祖父母更大,以此类推[…],因此在平均情况下,插入需要恒定的时间

上的声明是,插入在最坏的情况下为O(logn),但平均为O(1):

所需的操作数仅取决于新元素必须提升以满足heap属性的级别数,因此插入操作的最坏情况时间复杂度为O(logn),但平均情况复杂度为O(1)

以下是证明这一点的尝试:

但是,平均而言,新插入的元素不会在树上移动很远。特别是,假设密钥分布均匀,它有一半的几率大于其父级;考虑到它比它的父母更大,它有一半的几率比它的祖父母更大;考虑到它比它的父母更大,它有一半的几率比它的曾祖父母更大,以此类推[…],因此在平均情况下,插入需要恒定的时间

不过,这肯定是胡说八道?在我看来,如果树是随机排序的,那么新元素比其父元素大的几率是50/50;但是,粗略地说,由于大型元素沉入底部,因此随着堆的增长,可能性远远小于50/50

是这样吗


Wikipedia上几个月都是这样的…

对于平均堆插入时间为O(1)的说法,有一个更好的参考:Hayward&McDiarmid的1991年论文“”。(这篇文章链接在维基百科文章的参考文献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的复杂性进行对比时,给出了堆中恒定平均插入时间的详细图形分析。

注意,“底部”也占整个堆的50%左右。我觉得这也有点不对劲。。。如果你在CS SE站点询问,你可能会得到更多的关注。第一个链接断开了。这里有另一个选择:@ofek:谢谢。我使用了维基百科参考资料中的web archive链接,以防它更持久。