|
16 | 16 |
|
17 | 17 | 把堆存储的最后那个节点移到填在根节点处,再从上而下调整父节点与它的子节点(**heapify-down**) |
18 | 18 |
|
19 | | -## 二项树 |
| 19 | +## 左倾堆 |
| 20 | + |
| 21 | +左倾堆的每个节点有一个附加信息,即`null path length(npl)`: 从一个节点到一个最近的不满节点的路径长度(不满节点:两个子节点至少有一个为NULL) |
| 22 | + |
| 23 | +左倾堆是一个符合下面要求的二叉树: |
| 24 | + |
| 25 | +1. 每个节点的Key大于(或小于)子节点的Key |
| 26 | +2. 对于任意节点的左右两个子节点,右子节点的`npl`不大于左子节点的`npl`. |
| 27 | + |
| 28 | +可以证明 如果一个左倾堆的右侧路径上有r个节点,那么该左倾堆将至少有2^r-1个节点,整个左倾堆至少有2^(r+1)-1个节点,因此如果沿着右侧路径合并,复杂度 |
| 29 | +为log(n). |
| 30 | + |
| 31 | +左倾堆合并算法: |
| 32 | + |
| 33 | +1. 如果一个空左倾堆与一个非空左倾堆合并,返回非空左倾堆 |
| 34 | +2. 如果两个左倾堆都非空,那么比较两个根节点的value.取较小的根节点为新的根节点,合并较小根节点堆的右子堆与较大根节点堆. |
| 35 | +3. 如果右子堆npl > 左子堆npl,互换右子堆与左子堆. |
| 36 | +4. 更新根节点的npl = 右子堆npl + 1 |
| 37 | + |
| 38 | + |
| 39 | + |
| 40 | +## 二项堆 |
| 41 | + |
| 42 | +二项堆是一系列二项树的集合,二项树定义如下: |
| 43 | + |
| 44 | +### 二项树 |
20 | 45 |
|
21 | 46 | 二项树是递归的定义的: |
22 | 47 |
|
23 | 48 | 1. 度为0的二项树只包含一个节点 |
24 | | -2. 度为k的二项树有一个根节点,根节点有k个子女,每个子女分别是度数为k-1,k-2,……,2,1的二项树的根 |
| 49 | +2. 度为k的二项树有一个根节点,根节点有k个子女,每个子女分别是度数为k-1,k-2,……,2,1,0的二项树的根 |
25 | 50 |
|
26 | | -## 二项堆 |
| 51 | +二项树实现结构如下: |
| 52 | + |
| 53 | +* 每个节点持有一个父节点指针 |
| 54 | +* 每个节点只有一个孩子指针,指向第一个孩子 |
| 55 | +* 每个节点有一个邻居指针,指向下一个邻居,通过孩子指针和孩子指针的邻居指针可以遍历所有的孩子. |
| 56 | + |
| 57 | + |
27 | 58 |
|
28 | 59 | 二项堆是指满足以下性质的二项树的集合: |
29 | 60 |
|
|
56 | 87 |
|
57 | 88 | 将需要删除的结点的关键字的值减小到负无穷大(比二项堆中的其他所有关键字的值都小即可),执行“减小关键字的值”算法,使其调整到当前二项树的根节点位置,再删除最小关键字的根结点即可 |
58 | 89 |
|
59 | | -## 左倾堆 |
60 | | - |
61 | | -左倾堆的每个节点有一个附加信息,即`null path length(npl)`: 从一个节点到一个最近的不满节点的路径长度(不满节点:两个子节点至少有一个为NULL) |
62 | | - |
63 | | -左倾堆是一个符合下面要求的二叉树: |
64 | | - |
65 | | -1. 每个节点的Key大于(或小于)子节点的Key |
66 | | -2. 对于任意节点的左右两个子节点,右子节点的`npl`不大于左子节点的`npl`. |
67 | | - |
68 | | -可以证明 如果一个左倾堆的右侧路径上有r个节点,那么该左倾堆将至少有2^r-1个节点,整个左倾堆至少有2^(r+1)-1个节点,因此如果沿着右侧路径合并,复杂度 |
69 | | -为log(n). |
70 | | - |
71 | | -左倾堆合并算法: |
72 | | - |
73 | | -1. 如果一个空左倾堆与一个非空左倾堆合并,返回非空左倾堆 |
74 | | -2. 如果两个左倾堆都非空,那么比较两个根节点的value.取较小的根节点为新的根节点,合并较小根节点堆的右子堆与较大根节点堆. |
75 | | -3. 如果右子堆npl > 左子堆npl,互换右子堆与左子堆. |
76 | | -4. 更新根节点的npl = 右子堆npl + 1 |
77 | | - |
78 | | - |
79 | | - |
80 | 90 | ## 斐波那契堆(Fibonacci Heap) |
81 | 91 |
|
82 | 92 | 斐波那契堆是一系列无序树的集合,每棵树是一个最小堆,满足最小堆的性质.堆保存了堆中所有节点的数目,保存了最小关键字的节点. |
|
0 commit comments