【问题标题】:Heap insertion and deletion堆插入和删除
【发布时间】:2016-10-19 15:35:46
【问题描述】:

首先,我必须从堆中删除 7,然后添加 17 和 14。

问题是我不知道那个堆是什么。是最小堆吗?还是二项式堆?

你们谁能解释我如何做(或/和)起草每个操作?

谢谢

【问题讨论】:

  • 这不是堆。即使您尝试理解绘制它的荒谬方式,任何可能的根选择都会产生违反堆不变量的树。
  • 根据我必须做的练习,它是一个堆。反正我的看法和你一样。我无法从该草稿中识别出一堆。
  • 其实可以是pairing heap,以3为根。它画得很奇怪,但似乎满足配对堆的条件。
  • @JimMischel:如果你的假设是正确的,那么 11 处的堆中是否存在错误(因为 10 更小)?
  • @500-InternalServerError:可能。我没有时间坐下来构建一个示例案例,但我确实记得配对堆可以创建一些非常不直观的树。

标签: algorithm heap graph-algorithm binary-heap


【解决方案1】:

堆内的任何元素都可以在O(logn) 中删除,只需替换它为最后一个叶子 然后在最后一片叶子上应用Heapify operation

你必须在右下角的第一个空叶子上添加新节点,然后堆化那个叶子。

堆化:

  • 反复交换新元素(一般: 违反堆条件)与其父节点,只要它是 小于父级,并且不是根。
  • 反复交换 具有最小值的子元素的新元素,直到新元素 元素变成一个离开或两个子节点都大于 元素本身。

【讨论】:

  • 您似乎在谈论二进制堆。虽然确实可以在 O(logn) 时间内删除,但找到要删除的节点需要 O(n) 时间。
  • 是的,交换 11 和 10 会使给定的树成为以 3 为根的二叉最小堆。
  • 并非如此。二叉堆应该是平衡的,叶子级别是左填充的。否则查找子节点的计算不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2010-11-25
  • 2017-06-06
  • 2014-11-09
  • 2019-09-07
  • 2015-10-18
相关资源
最近更新 更多