在左侧堆队列上堆化的复杂性

时间:2016-03-24 16:36:53

标签: algorithm heap complexity-theory leftist-tree

"数据结构和网络算法" Tarjan在leftiest heaps中说明了如下的堆化函数:

heap function heapify (list q);
  do |q| ≥ 2 → := q[3..] & meld (q(1), q(2)) od;
  return if q = [ ] → null | q != [ ] → q(1) fi
end heapify;

q正在成为我们想要堆积在一起的堆的队列。 meld(h1, h2)是一个合并两个堆并恢复堆属性的函数。 meld(h1, h2)具有复杂性 O(logn),其中 n 是两个堆中节点的总数。这使得一次通过队列的复杂性如下:

enter image description here (等式1)

这似乎是合理的。我没有得到的是整个堆化的时间:

enter image description here (等式2)

k这里是原始堆的数量,n它们包含的项目总数。事先还提到了两个约束:

enter image description here (公式3)

有人可以帮我理解Eq。 2是派生的? (如何解释方程2中等式的左表达式)

1 个答案:

答案 0 :(得分:0)

我找到了解决方案,结果非常明显:

在每次迭代中,队列元素的数量减半。这使得每次迭代k / 2。观察所有迭代,数字指数缩小到2的基数,即对于i = 0,我们有k; i = 1 k / 2; i = 2 k / 4; i = 3 k / 8和s.o.这就是为什么总和达到lg k并且堆的数量减少了k /(2 ^ i)。公式中的总和3告诉我们,所有元素都在当前运行的堆之间传播。正如我们刚才所知,每次迭代的堆数是k /(2 ^ i)。这就是每个队列运行的最大值为n_i = n /(k /(2_i))= n *(2_i)/ k的原因。所有这些共同解释了方程式。 2,在删除常数后,我们得到右侧的等式。