some modifications to heap.md.

This commit is contained in:
Shine wOng
2019-09-25 18:02:01 +08:00
parent 3ccaf850a6
commit b5eb73bfb8

View File

@@ -192,9 +192,9 @@ void CBHeap<K, V> heapify(entry<K, V>* 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`树的思想——使处于底层的多数节点具有更小的权重,或者更快的操作。