用左偏树实现的优先队列,合并操作的时间复杂度为对数时间。关于左偏树为什么有此特点,我们还是要从左偏树的定义出发,此处我们对高度左偏树进行分析;
相关定义:
扩展二叉树:一棵扩展二叉树是一棵二叉树,其中所有空的子二叉树都被替换为一个方块节点(称为外部结点,而树中原来结点称为内部结点);扩展二叉树是为讲解左偏树定义而引人的概念,并非真的是有方块节点存在,只是从概念上而言的。
0 如果x是外部结点
shorstest(x):定义为从x到外部结点的最短路径长度。shorstest(x)= {
1+min{ shorstest(LeftChild(x)),shorstest(RightChild(x))} 其他;
左偏树:是这样一棵二叉树,如果非空,那么公式:
shorstest(LeftChild(x)) >= shorstest(RightChild(x))
对于每个内部结点x都满足;
左偏树特性:
设r是一个具有n个结点(内部)的左偏树的根节点:
(a) n >= 2^shorstest(r) -1;
(b) 最右边从根到外部结点的路径是从跟到外部结点的最短路径。其长度shortstest(r)<=log2 (n+1);(以2为底);
注意其实,左偏树的合并就是沿着两棵待合并左偏树的(b)特性中的最短路径进行的,由于其长度有上限 logn 故合并这两棵树时的时间复杂度也就是O(log n),这样就保证了左偏树合并的高效性;
总而言之:左偏树的左偏特性使其最右边的从根到外部结点的路径长度上限为 log(n), 其实一棵具有n个结点的左偏树当它为满二叉树时,该路径长度达到上限,该上限即为n个结点的满二叉树的高度 k=log2(n+1);这样就保证了合并的高效性;