高级数据结构—二项堆与斐波那契堆详细介绍(算法导论中科大USTC)

Posted 之墨_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高级数据结构—二项堆与斐波那契堆详细介绍(算法导论中科大USTC)相关的知识,希望对你有一定的参考价值。

二项堆与斐波那契堆

斐波那契堆请点击这里👈

数据结构与堆

下图列出了小顶堆在各种数据结构(链表、二叉堆、二项堆、斐波那契堆、松弛堆)的实现下,各种基本操作的时间复杂度

二项树

二项堆是二项树的集合。在了解二项堆之前,先对二项树进行介绍。

定义

二项树是一种递归定义的有序树。它的递归定义如下:

  1. 二项树 B 0 B_0 B0只有一个结点
  2. 二项树 B k B_k Bk由两棵二项树 B ( k − 1 ) B_(k-1) B(k1)组成的,其中一棵树是另一棵树根的最左孩子

性质


[性质一]
B k B_k Bk共有 2 k 2^k 2k个节点。
如上图所示, B 0 B0 B0 2 0 = 1 2^0=1 20=1节点, B 1 B_1 B1 2 1 = 2 2^1=2 21=2个节点, B 2 B_2 B2 2 2 = 4 2^2=4 22=4个节点,…
[性质二]
B k B_k Bk的高度为 k k k
如上图所示, B 0 B_0 B0的高度为 0 0 0 B 1 B_1 B1的高度为 1 1 1 B 2 B_2 B2的高度为 2 2 2,…
[性质三]
B k B_k Bk在深度 i i i处恰好有 C ( k , i ) C(k,i) C(k,i)个节点,其中 i = 0 , 1 , 2 , . . . , k i=0,1,2,...,k i=0,1,2,...,k
C ( k , i ) C(k,i) C(k,i)是高中数学中阶乘元素,例如,
C ( 10 , 3 ) = ( 10 ∗ 9 ∗ 8 ) ( 3 ∗ 2 ∗ 1 ) = 240 C(10,3)=\\cfrac(10*9*8) (3*2*1)=240 C(10,3)=(321)(1098)=240
B 4 B_4 B4中深度为 0 0 0的节点 C ( 4 , 0 ) = 1 C(4,0)=1 C(4,0)=1
B 4 B_4 B4中深度为 1 1 1的节点 C ( 4 , 1 ) = 4 / 1 = 4 C(4,1)= 4 / 1 = 4 C(4,1)=4/1=4
B 4 B_4 B4中深度为 2 2 2的节点 C ( 4 , 2 ) = ( 4 ∗ 3 ) / ( 2 ∗ 1 ) = 6 C(4,2)= (4*3) / (2*1) = 6 C(4,2)=(43)/(21)=6
B 4 B_4 B4中深度为 3 3 3的节点 C ( 4 , 3 ) = ( 4 ∗ 3 ∗ 2 ) / ( 3 ∗ 2 ∗ 1 ) = 4 C(4,3)= (4*3*2) / (3*2*1) = 4 C(4,3)=(432)/(321)=4
B 4 B_4 B4中深度为 4 4 4的节点 C ( 4 , 4 ) = ( 4 ∗ 3 ∗ 2 ∗ 1 ) / ( 4 ∗ 3 ∗ 2 ∗ 1 ) = 1 C(4,4)= (4*3*2*1) / (4*3*2*1) = 1 C(4,4)=(4321)/(4321)=1
合计得到 B 4 B_4 B4的节点分布是 ( 1 , 4 , 6 , 4 , 1 ) (1,4,6,4,1) (1,4,6,4,1)

[性质四]
根的度数为 k k k,它大于任何其它节点的度数。
节点的度数是该结点拥有的子树的数目。

二项堆

定义

二项堆是指满足以下性质的二项树的集合:

  1. 每棵二项树都满足最小堆性质。即,父节点的关键字 < = <= <= 它的孩子的关键字。
  2. 不能有两棵或以上的二项树具有相同的度数(包括度数为 0 0 0)。换句话说,具有度数 k k k的二项树有 0 0 0个或 1 1 1个。

上图就是一棵二项堆,它由二项树 B 0 B_0 B0 B 1 B_1 B1 B 4 B_4 B4组成。对比二项堆的定义:

  1. 二项树 B 0 、 B 1 、 B 4 B_0、B_1、B_4 B0B1B4都是最小堆
  2. 二项堆不包含相同度数的二项树

性质

二项堆的第 1 1 1个性质保证了二项堆的最小节点就是某个二项树的根节点,第 2 2 2个性质则说明结点数为n的二项堆最多只有 log ⁡ n + 1 \\logn + 1 logn+1棵二项树。实际上,将包含 n n n个节点的二项堆,表示成若干个 2 2 2的指数和(或者转换成二进制),则每一个 2 2 2个指数都对应一棵二项树。例如, 13 13 13(二进制是 1101 1101 1101)的 2 2 2个指数和为 13 = 23 + 22 + 20 13=23 + 22+ 20 13=23+22+20, 因此具有 13 13 13个节点的二项堆由度数为 3 , 2 , 0 3, 2, 0 3,2,0的三棵二项树组成。

实现

  • 使用左子级、右同级指针表示树。 每个节点三个链接:父节点、左节点(最左边的子节点)、右边(右边的同级节点)。
  • 与单链表相连的树根。 当我们遍历根链时,树的度数会严格增加。

内存

下图为二项式堆 H H H,堆由二元树 B 0 、 B 2 和 B 3 B_0、B_2 和B_3 B0B2B3组成,它们分别具有 1 、 4 和 8 1、4 和 8 算法导论——斐波那契堆

递归与斐波那契数列

Dijkstra算法介绍及其优先队列优化和斐波那契堆优化

递归与斐波那契数列

斐波那契堆

深度解析(十四)斐波那契堆