引言
二叉堆是对优先队列的一种高效实现,左式堆是针对二叉堆合并操作困难的缺点,而提出的另外一种优先队列实现方式。
线性结构合并困难是显而易见的,而二叉堆那样高效的支持合并操作而且只使用一个数组更是难得。 这是因为,合并似乎需要把一个数组拷贝到另一个数组中去,对于相同大小的堆,这将花费O(N)。 但这区区O(N)还不够,所以就不能使用顺序存储结构,应该使用链式指针。有一句话说的特别好:所有支持高效合并的高级数据结构都需要使用指针。 能更高效完成合并的左式堆和二项队列显然都是使用了指针,是链接存储的。
左式堆详解这里有一篇比较详细的讲解,可看
从npl属性看左式堆注意理解 npl 这个属性,npl 是 null path length 的缩写,意为从该结点到达一个没有两个孩子的结点的最短距离(一个孩子的结点或者叶子结点)。 一般定义 null 的 npl 为 -1 以使计算简便。 容易得到,任意结点的 npl 是它的子结点的 npl 中较小的那个结点的 npl+1 。 即