【问题标题】:Why is the average case for insertion in a Binary Heap O(1)?为什么在二叉堆中插入的平均情况是 O(1)?
【发布时间】:2016-11-24 18:36:39
【问题描述】:

如果删除的平均情况是 lg(n),这是有道理的,因为您必须 percDown 值来维护堆的完整性,为什么插入和 percUping 堆不一样?不是相对于输入(n)进行的比较量除以2吗?

【问题讨论】:

  • 你能详细说明一下吗?我以前从未听说过这种说法。当您说“平均情况”时,您的意思是“随机输入的平均值”吗?

标签: algorithm time-complexity computer-science


【解决方案1】:

这是一个有趣的提议。我试图做一个基本的计算。如果计算有问题,请查看并提及。它基本上是带有一些假设的机械计算。

假设:

  1. 2^k-1 元素的完整二叉树中已经有 k 级别。
  2. 我们添加了更多2^k 元素以使树具有k+1 级别。
  3. 元素均匀随机地位于[1..k]

(3) 表示旧树中的每个元素本质上都被一个新元素替换。因此,向上的渗透次数将是:

k + 2 * (k-1) + 4 * (k - 2) + ... + 2^(k-1) * 1
= k + 2 * k + 4 * k + ... + 2^(k-1) * k - (2 + 2 * 2^2 + 3 * 2^3 + ... + (k - 1) * 2^(k-1))
= k * (2 + 4 + ... + 2^(k-1)) - (k * 2^k - 2 * (2^k - 1)) ......(a)
= k * (2^k - 1) - k * 2^k + 2 ^(k+1) - 2
= k * 2^k - k - k * 2^k + 2^(k+1) - 2
= 2^(k+1) - (k + 2)

(a) 计算为here

因此我们有使用(2^(k+1) - (k+1) - 1) 步骤渗透的2^k 元素。因此,每个元素的平均成本O((2^(k+1) - (k+1) - 1) / 2^k) = O(2 - (k+2)/2^k),即O(1)

因此我们可以假设插入成本不变。

注意:如果我们假设一个元素将被概率0.5 替换,我们可以将其纳入上面的计算中,我认为这将导致该部门越来越接近1

【讨论】:

  • 我还没有完全考虑到这一点,但似乎没有考虑到插入 2^k 个新元素时,树上更高的元素可能会被替换多次。跨度>
  • 这意味着新元素的许多值都在旧值的最大值之间,对吧?这会是一个常见的平均情况吗?
  • 我假设每个节点最终都会被替换。所以实际上在上面的计算中,底部节点被替换的频率更高。
  • 我不清楚为什么元素在每个级别上都是均匀随机分布的。我看不出它是如何从我们以随机顺序插入它们的事实立即得出的。
【解决方案2】:

为什么插入和percUping堆不一样?

当你删除头 (h) 时,你将它与堆中的最后一个元素交换,即最长子树中的最低元素 (l)。将 l 放入更高级别堆的概率被认为低到可以忽略不计,因为它已经是其子树的最低元素。

存在特殊情况。例如,包含 N 个相等整数的堆将在 O(1) 中进行头部提取。但这不是一般情况。

【讨论】:

    【解决方案3】:

    当我开始学习二进制堆时,我只是想知道完全相同的事情。我用 C 编写了一个实现,当我对不同的操作进行计时时,我对这种现象感到困惑。经过一番思考,我的直觉是,正如其他人提到的,当删除一个元素时,它在堆中的位置被最后一个元素替换,即属于底部的元素,因此保证必须沉回底部。在我的测试中,我只尝试删除堆的顶部元素,因此这些删除总是导致遍历堆的整个高度(log n)。

    另一方面,插入是将新元素放在底部并让它向上浮动。我的想法是,由于堆的大部分元素都集中在较低的级别,因此新节点很可能只需要一两次跳转就到达了它的正确位置。即使节点的值是整个堆的平均值,它通常也不应该一直向上跳到堆的垂直中间层(实际上,将其视为包含 2^x 个元素的堆的底层包含整个堆的一半以上的节点)。不知道这是否有意义,但它对我有用:)。

    现在,如果通过删除我们正在谈论删除任何给定元素而不仅仅是顶部的元素,我不明白为什么平均情况也不应该是 O(1),因为那时我们应该最有可能被删除靠近底部的东西...

    【讨论】:

      猜你喜欢
      • 2013-06-07
      • 2011-06-02
      • 2010-10-24
      • 2023-01-11
      • 2013-01-03
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 2013-06-30
      相关资源
      最近更新 更多