Field note

Skew_heap

Skew Heap斜堆

特殊的leftist heap,且满足父节点值小于子节点(最小堆)

斜堆

合并

  • 如果一个空斜堆与一个非空斜堆合并,返回非空斜堆.
  • 如果两个斜堆都非空,斜堆直接把H1H_{1}的右子树和H2H_2合并,放在H1H_1的右子树位置.
  • 然后将当前根结点的左右孩子互换位置

摊还分析

引入定义:

  • 我们称一个结点P是重的(heavy),如果它的右子树结点个数至少是P的所有后代的一半(后代包括P自身).反之则称为轻结点(light node)

引理:

  • 对于右路径上右ll个轻结点的斜堆,整个斜堆至少有2l12^l - 1个结点,这意味着一个nn个结点的斜堆右路径上的轻结点个数为O(logn)O(\log{n})

那么我们可以有如下摊还时间复杂度的定理:

  • 若我们有两个斜堆H1H_1H2H_2,它们分别有n1n_1n2n_2个结点,则合并H1H_1H2H_2的摊还时间复杂度为O(logn)O(\log{n}),其中n=n1+n2n = n_1 + n_2

同时还可以有如下的性质:

  1. 在合并过程中,只有H1H_1H2H_2右路径上的结点才可能改变轻重状态.因为其他结点合并前后子树是完全复制的,不可能改变轻重状态
  2. H1H_1H2H_2右路径上的重结点在合并后一定会变成轻结点,这是因为右路径上的结点一定会交换左右子树,并且后续所有结点也都会继续插入在左子树上.然而轻结点不一定会变成重结点