diff --git a/thu_dsa/chp10/heap.md b/thu_dsa/chp10/heap.md index ee78896..ec83a20 100644 --- a/thu_dsa/chp10/heap.md +++ b/thu_dsa/chp10/heap.md @@ -192,9 +192,9 @@ void CBHeap heapify(entry* elems, int n){ 对`Floyd`算法进行分析,每一个内部节点,都将调用一次`percolate_down`函数,它的成本正比于每个节点的高度,因此整体的时间复杂度应该取决于所有内部节点的高度总和。假设完全二叉树的高度为`h`,则`Floyd`算法的时间复杂度为: -``` +$$ h \times 1 + (h - 1)\times 2 + \cdots + (h - k)\times 2^{k} + \cdots + 1 \times 2^{h-1} = 2^{h + 1} - h - 2 = n - log(n) = O(n) -``` +$$ 可以看到,`Floyd`算法和蛮力算法相比,蛮力算法是每个节点都调用一次上滤操作`percolate_up`,而`Floyd`算法是每个节点调用一次下滤操作`percolate_down`,而这就导致了它们性能上的巨大差别。具体说来,上滤操作的时间复杂度正比于节点的深度,而下滤操作的时间复杂度正比于节点的高度,对于完全二叉堆中的所有节点,大部分都是处于底层的节点,它们的高度较小而深度较大,因此`Floyd`算法就是让多数节点的操作较快,而蛮力算法则是使多数节点的操作更慢,这就是它们性能上差别的本质原因。实际上,`Floyd`算法就类似于`Huffman`树的思想——使处于底层的多数节点具有更小的权重,或者更快的操作。