各种堆——二叉堆,d堆,左式堆,斜堆,二项队列,斐波那契堆

二叉堆

二叉堆就是一个完全二叉树。几乎在所有需要用到优先队列的时候,使用它就完事了。只需要一个数组,完美的插入,删除,查询时间复杂度。但是残念,二叉堆的合并至少需要o(n)的复杂度。

D-堆

D堆就是一个完全d叉树。所以,d堆会比二叉堆浅的多。

左式堆

Clark Allan Crane,1972年发明。叫这个名字地原因就是这个树左边比右边高。左式堆不是理想平衡的,而是实际上非常趋向于不平衡的。

零路径长:从节点X到一个没有两个子节点的(有一个子节点或没有子节点)节点的最短距离

左式堆首先是一个二叉查找树。附加一个条件

要求任一节点的左子节点零路径长大于等于右子节点的零路径长

左式堆的合并过程
第一步,符合堆的原则进行合并。
各种堆——二叉堆,d堆,左式堆,斜堆,二项队列,斐波那契堆_第1张图片
第二步,对于不符合的左式堆要求的节点,请调换左右节点。
各种堆——二叉堆,d堆,左式堆,斜堆,二项队列,斐波那契堆_第2张图片

斜堆

斜堆是左式堆的自调节形式。其和左式堆的关系类似与伸展树和AVL树之间的关系。

二项队列

一个二项队列不是一棵树,而是树的集合,即森林。其中的每一棵树被叫做二项树(binomial tree)。高度为0的二项树是是一个单节点树。高度为k的树有2^k个节点。二项队列比如说以下形式
各种堆——二叉堆,d堆,左式堆,斜堆,二项队列,斐波那契堆_第3张图片
上面的二项队列包含三个二项树。那么,为什么叫二项树呢?上面第二棵树从上倒下层的节点数为121,第三棵树是1331。没错,如果这是一到找规律的脑残题目的话,你已经猜到了这就是二项系数。
各种堆——二叉堆,d堆,左式堆,斜堆,二项队列,斐波那契堆_第4张图片
二项树的递归定义如下

 二项树B0只有一个结点;
二项树Bk由两棵二项树B(k-1)组成的,其中一棵树是另一棵树根的左孩子。

二项树有以下的性质

Bk共有2k个节点。
Bk的高度为k。
Bk在深度i处恰好有二项系数C(k,i)个节点,其中i=0,1,2,...,k。
根的度数(子节点数)为k,它大于任何其它节点的度数。

在此基础上,我们可以定义二项队列

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

下面是一个13个节点的二项队列。
各种堆——二叉堆,d堆,左式堆,斜堆,二项队列,斐波那契堆_第5张图片
显然,二项队列查找最小值就是遍历所有二项树的根节点,然后找最小。

斐波那契堆

配对堆

你可能感兴趣的:(算法)