【问题标题】:What is the use of the Heap data structure?Heap数据结构有什么用?
【发布时间】:2011-03-08 03:26:15
【问题描述】:

我正在做一些涉及堆的作业,并且我了解它们的结构。一个堆必须有满足堆属性的每个节点,

最大堆属性是 除了根以外的每个节点, 堆[父(i)] >= 堆[i]

所以在每个节点上,较高的节点具有较高的数字,较低的节点具有较低的数字。我明白这一点。但是我看不到使用堆来简单地获取列表中最高的 n 个数字。我没有看到一种简单的方法来搜索特定值并返回节点,或者搜索 n 最小的数字(在最大堆中)。两者在二叉搜索树中都相对容易。

你为什么不直接使用一个简单的二叉搜索树呢?或者更好的是平衡二叉搜索树?

编辑: 我应该注意,这不是在寻找家庭作业问题的答案。实际的作业问题是为 insert() 和 extractMax() 函数编写并行 p 堆的伪代码。我已经回答了他们。他们只是让我意识到我并不真正了解堆。

【问题讨论】:

  • @Jeremiah,我在 SO 上搜索了答案,但错过了那个。是的,看起来我是个骗子。我应该结束我的问题吗?
  • 不需要。它即将被我们关闭,但抄袭通常被认为是好事,因为问同一个问题的方法不止一种。
  • 为我工作,我得到了答案。
  • @Jeremiah,将该评论移至答案,我会接受。

标签: data-structures heap


【解决方案1】:

堆数据结构有很多应用。

  • 堆排序:最好的排序方法之一是就地排序,没有二次最坏情况。
  • 选择算法:使用堆可以在线性时间(通常是常数时间)内找到最小值、最大值、最小值和最大值、中值甚至第 k 个最大元素。[4]
  • 图算法:通过使用堆作为内部遍历数据结构,运行时间将按多项式顺序减少。此类问题的示例包括 Prim 的最小生成树算法和 Dijkstra 的最短路径问题。

完全和几乎完全的二进制堆可以单独使用数组以非常节省空间的方式表示。第一个(或最后一个)元素将包含根。数组的下两个元素包含它的子元素。接下来的四个包含两个子节点的四个子节点,依此类推。因此,位置 n 处的节点的子节点将位于从 1 开始的数组中的位置 2n 和 2n+1,或者位于数组中的 2n+1 和 2n+2从零开始的数组。这允许通过进行简单的索引计算来向上或向下移动树。通过交换无序的元素来平衡堆。因为我们可以从一个数组构建一个堆而不需要额外的内存(例如对于节点),所以可以使用 heapsort 对数组进行就地排序。

在某些应用程序中,堆相对于树的另一个优势是可以使用 Tarjan 算法在线性时间内完成堆的构建。

参考:http://en.wikipedia.org/wiki/Heap_%28data_structure%29

【讨论】:

    【解决方案2】:

    由于缺少指针(堆通常使用基于数组的数据结构),操作往往比二叉树更快。此外,一些更复杂的堆(例如二项式)可以有效地合并,这对于二叉树来说并不容易。 this SO question 也有相关信息。

    【讨论】:

      猜你喜欢
      • 2012-10-07
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多