📜  DAA-二进制堆

📅  最后修改于: 2021-01-12 03:37:57             🧑  作者: Mango


堆有几种类型,但是在本章中,我们将讨论二进制堆。二进制堆是一种数据结构,看起来类似于完整的二进制树。堆数据结构遵循下面讨论的排序属性。通常,堆由数组表示。在本章中,我们用H表示堆。

由于堆的元素存储在数组中,因此将起始索引视为1 ,则可以在element i / 2处找到i元素的父节点的位置。i节点的左子节点和右子节点位于2i2i +1位置。

根据排序属性,二进制堆可以进一步分为最大堆最小堆

最大堆

在此堆中,节点的键值大于或等于最高子级的键值。

因此, H [Parent(i)]≥H [i]

最大堆

最小堆

在均值堆中,节点的键值小于或等于最低子级的键值。

因此, H [Parent(i)]≤H [i]

在这种情况下,以下是有关Max-Heap的基本操作。元素在堆中的插入和删除需要元素的重新排列。因此,需要调用Heapify函数。

最小堆

数组表示

完整的二叉树可以由数组表示,并使用级别顺序遍历存储其元素。

让我们考虑一个将由数组H表示的堆(如下所示)。

数组表示

考虑到起始索引为0 ,使用级别顺序遍历,将元素按以下方式保存在数组中。

Index 0 1 2 3 4 5 6 7 8
elements 70 30 50 12 20 35 25 4 8

在这种情况下,相对于Max-Heap表示堆上的操作。

为了找到索引i处元素的父级的索引,使用以下算法Parent(numbers [],i)

Algorithm: Parent (numbers[], i) 
if i == 1 
   return NULL 
else 
   [i / 2]

可以使用以下算法Left-Child(numbers [],i)找到索引i处元素的左子元素的索引。

Algorithm: Left-Child (numbers[], i) 
If 2 * i ≤ heapsize 
   return [2 * i] 
else 
   return NULL 

可以使用以下算法Right-Child(numbers [],i)找到索引i处元素的右子元素的索引。

Algorithm: Right-Child (numbers[], i) 
if 2 * i < heapsize 
   return [2 * i + 1] 
else 
   return NULL