【补充】二项树与二项堆

二项树

二项树 B k B_k Bk 是一种递归定义的有序树。如下图所示,二项树 B 0 B_0 B0 只包含一个结点,二项树 B k B_k Bk 由两棵二项树 B k − 1 B_{k-1} Bk1 连接而成:其中一棵树的根是另一棵树的根的最左孩子。

二项树 B k B_k Bk 的性质

  1. 共有 2 k 2^k 2k 个结点。
  2. 树的高度为 k k k
  3. 在深度 i i i 处恰有 C k i C_k^i Cki 个结点,其中 i = 0 , 1 , 2 , ⋯   , k i=0, 1, 2, \cdots, k i=0,1,2,,k
  4. 根的度数为 k k k,它大于任何其他结点的度数;并且,如果根的子女从左到右编号为 k − 1 , k − 2 , ⋯   , 0 k-1, k-2, \cdots, 0 k1,k2,,0,子女 i i i 是子树 B i B_i Bi 的根。

推论:在一棵包含 n n n 个结点的二项树中,任意结点的最大度数为 log ⁡ n \log n logn

二项堆

二项堆 H H H 由一组满足下面二项堆性质的二项树组成。

  1. H H H 中的每个二项树遵循最小堆性质,即结点的关键字大于或等于其父结点的关键字。我们称这种树是最小堆有序的。
  2. 对任意非负整数 k k k,在 H H H 中至多有一棵二项树的根具有度数 k k k

二项堆 H H H 最多包含 ⌊ log ⁡ n ⌋ + 1 \lfloor \log n \rfloor+1 logn+1 棵二项树。

image-20230630193900928

上图为一个包含13个结点的二项堆。(a)一个二项堆包含了二项树 B 0 , B 2 , B 3 B_0, B_2, B_3 B0,B2,B3,它们分别由1个、4个、8个结点,即共有13个结点。由于每棵二项树都是最小堆有序的,所以任意结点的关键字都不小于其父结点的关键字。图中还标记出了根链,它是一个按根的度数递增排序的链表。(b)二项堆 H H H 的一个更具体的表示,每棵二项树按左孩子、右兄弟表示方式存储,每个结点还存储自身的度数。

合并两个二项堆

下面的过程合并二项堆 H 1 H_1 H1 H 2 H_2 H2,并返回结果堆。在合并过程中也破坏了 H 1 H_1 H1 H 2 H_2 H2。过程中使用了一个辅助过程BINOMIAL-HEAP-MERGE,将 H 1 H_1 H1 H 2 H_2 H2 的根链表合并成一个按度数单调递增的链表。BINOMIAL-HEAP-MERGE过程与归并排序的过程类似。

image-20230630200251613

WPS拼图0

BINOMIAL-HEAP-UNION的运行时间为 O ( log ⁡ n ) \Omicron(\log n) O(logn)

二项堆的应用

  • 最小生成树算法
    • Kruskal算法
    • Prim算法
  • 最短路径算法
    • Dijkstra算法

参考

posted @ 2023-06-30 20:16  gengduc  阅读(19)  评论(0编辑  收藏  举报  来源