当前位置: 首页 > 知识库问答 >
问题:

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

洪子晋
2023-03-14

Wikipedia页面上关于二进制堆的声明是,在最坏的情况下插入是O(log n),但平均为O(1):

链接的页面试图如下说明:

但是,平均来说,新插入的元素在树中并不会移动很远。特别是,假设密钥分布均匀,它有一半的机会大于其父项;它有二分之一的机会比它的祖父母更大,因为它比它的父母更大;它有一半的机会比它的曾祖父母大,因为它比它的父母大,依此类推[...]因此在一般情况下插入需要恒定的时间

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

在维基百科上都是这样几个月了...

共有1个答案

薛飞星
2023-03-14

对于平均时间堆插入是O(1)的说法,有一个更好的参考文献:1991年Hayward&McDiarmid的论文“重复插入堆构建的平均案例分析”(average Case Analysis of heap Building by Repeative insertion)。(本文链接在目前维基百科文章的参考文献4中。)这篇论文又引用了Porter&Simon 1975年的一篇论文“Random insertion into a priority queue Structure”(随机插入到一个优先级队列结构中),该论文涉及到一个堆中的单个插入,并证明了平均情况是O(1)。

从直觉上看,这个论点很简单。堆的一半是一片叶子,叶子往往更大。如果我们暂时假设leafs是堆中最大的元素(而不是倾向于更大),那么我们可以说一个新元素是leaf--即它在值范围的上半部分中--的概率正好是0.5。如果新元素不是堆的叶子(也是概率0.5),我们可以用仅由原始堆中的非叶子节点组成的截断的堆重复该过程,因此新元素处于第二低级别的概率将是剩余的一半:0.25。因此,它处于第三级的概率是0.125,以此类推。那么我们需要搜索的层数是1*0.5+2*0.25+3*0.125…,也就是2。

当然,随机新元素大于一个随机二级父元素的概率并不是真的0.5;其实少了一点。但是,只要它以一个常数为界,计算期望比较数的幂级数之和也将以一个常数为界。结果是常数在2.6左右。

请参阅这个有用的答案,它在讨论堆的复杂性并将其与BST的复杂性进行对比的同时,给出了堆中恒定的平均插入时间的详细图形分析。

 类似资料:
  • 我不明白堆排序的空间复杂度是怎样的O(1)?虽然快速排序不使用任何额外的数组(即就地),但在最坏情况下其空间复杂度为O(n),在最佳情况下为O(lg n),因为在递归调用的后端使用堆栈。我说得对吗? 堆排序也是如此。虽然,它是就地的,但是由于Build-Heap函数调用Max-Heapify函数,所以它的空间复杂度应该等于Max-Heapify,即O(lg n)。不是吗?此外,稍后在根节点调用Ma

  • 在最近的一次测试中,我们得到了一个函数来计算未排序的ArrayList中出现了多少个double(不是原语double,而是一个项目出现了两次)。 我正确地确定了Big O复杂度为O(N^2),但由于我错误地确定了全部复杂度,因此只获得了部分学分。函数如下: 在他刚刚发布的考试解决方案中,他给出了这样的解释: 输入集合中有N个项,该方法通过一个缩减步骤反复调用自己,该步骤生成一个新索引N次,直到达

  • 这个网站已经有一些关于这个话题的问题,但是在阅读了一些答案后,我感到困惑。 https://cs.stackexchange.com/questions/20/evaluating-the-average-time-complexity-of-a-given-bubblesort-algorithm 在上面的链接中,“Joe”的回答表示,平均而言,泡沫排序的掉期数量与平均反转数量相同,即(n)(n

  • 问题内容: 我刚刚开始学习数据结构,并且在进行数组插入时想知道为什么数组插入的时间复杂度为O(n)而不是O(n + 1)? 在最佳情况下,当插入在最后时,时间复杂度为O(1)。我想我们正在考虑1插入元素,因为这里没有元素被移动。在最坏的情况下,假设我们必须移动n个元素然后插入新元素,那么时间时间复杂度是否应该为O(n + 1)?n用于移动元素,1用于插入。 非常感谢您的帮助。 问题答案: O(n)

  • 即使在最坏的情况下,是否有任何数据结构可以提供O(1)——即常数——插入复杂性和O(log(n))搜索复杂性? 排序后的向量可以进行O(log(n))搜索,但插入需要O(n)(考虑到我并不总是在前面或后面插入元素这一事实)。而列表可以进行O(1)插入,但不能提供O(log(n))查找。 我想知道这样的数据结构是否可以实现。

  • 我知道,对于迭代,递增。