我正在做一些涉及堆的家庭作业,我理解它们的结构。堆必须使每个节点满足堆属性
max-heap属性是 除了root之外的每个节点 堆[父(i)]> =堆[i]
因此,在每个节点处,较高节点具有较高数量,较低节点具有较低数量。我理解这一点。但我看不到使用Heap,只是简单地获得列表中最高的n个数字。我没有看到一种简单的方法来搜索特定值并返回节点,或者搜索n个最小数字(在最大堆中)。在二叉搜索树中,两者都相对容易。
为什么不使用简单的二叉搜索树?或者更好的是,平衡的二叉搜索树?
编辑: 我应该注意,这不是寻找家庭作业问题的答案。实际的作业问题是为insert()和extractMax()函数编写parallel-p-heap的伪代码。我已经回答了他们。他们让我意识到我并不真正了解Heaps。
答案 0 :(得分:13)
堆数据结构有很多应用程序。
完全和几乎完整的二进制堆可以使用单独的阵列以非常节省空间的方式表示。第一个(或最后一个)元素将包含根。数组的下两个元素包含其子元素。接下来的四个包含两个子节点的四个子节点等。因此,位置n处的节点的子节点将位于基于一个阵列的位置2n和2n + 1中,或者位于2n + 1和2n + 2中从零开始的数组。这允许通过简单的索引计算来向上或向下移动树。通过交换乱序的元素来完成堆的平衡。由于我们可以从数组构建堆而不需要额外的内存(例如,对于节点),因此可以使用heapsort对数组进行就地排序。
在某些应用中,堆叠超过树的另一个优点是可以使用Tarjan算法在线性时间内完成堆的构建。
答案 1 :(得分:5)
由于缺少指针(堆通常使用基于数组的数据结构),操作往往比二叉树更快。此外,可以有效地合并一些更复杂的堆(例如二项式),这对于二叉树来说并不容易。 this SO question还提供了相关信息。