1. 原址的 in place 指不需要占用非常数的空间
2. 堆的高度指的是该节点到叶节点的最长简单路径。!!!由于元素个数最多为2^(h+1)-1,所以推导出堆的高度对于叶节点为0
3. 6.1-4假设一个最大对的所有元素都不同,那么该堆的最小元素应该在叶子结点,这个节点可能在最底层,也可能在次底层。
4. 堆大小为length,只需要从length/2向下取整开始做max-heapify就可以,对于叶节点不需要处理
5. n个元素的堆高度为向下取整lgn,
6. 对于任意包含n个元素的堆,至多有向上取整【n/(2^(h+1))】个高度为h的节点
证明,数学归纳:对于h=0的叶节点,最多为满额,最后一个元素n的父子节点为向下取整【n/2】,按照满额假设,则该父节点为次底层的最后一个元素,则最后一层h=0的节点数为n-向下取整[n/2] = 向上取整[n/2],满足假设
假设对于h=k层的节点该结论成立,则对于h=k+1层,数目为k层的二分之一,【叶节点按照满额来算】,也即节点数N[k+1] = N[k]/2
相对于假设来说成立。
7. 建堆的时间复杂度是O(n),P88
关键是要证明Sig h/(2^h) 从零到logn向下取整是常数。
可以将其延展到零到正无穷,上述是一个差比数列,设上述的值为S
乘以公比1/2 则1/2S = sig h/(2^(h+1)) 零到正无穷
也即:
S = 1/(2^1)+ 2/(2^2)+3/(2^3)+4/(2^4)+……
(1/2)S = 1/(2^2)+2/(2^3)+3/(2^4)+4/(2^5)+……
S和1/2S做差,错位相减,则
(1/2)S = 1/(2^1)+ 1/(2^2)+1/(2^3)+1/(2^4)+…… 等比数列
= a1(1-q^n)/(1-q) = (1/2)*(1-(1/2)^n)/(1-1/2) = 1-(1/2)^n)<1
则S<2 是常数,得证
8. 堆排序时,直接将最大值1位置的数与当前存活的heapsize最尾端的数交换【length是维护堆的数组长度,heapsize是当前还有效,存货的堆的长度,heapsize<=length】,最终的从1到n的数组位置既是从小到大排序的,不需要另外的空间!!!
9. 最大优先队列:共享计算机系统的作业调度
最小优先队列:基于事件驱动的模拟器,按照发生的时间顺序进行模拟
10. 新增insert操作时先将扩增后的heapsize对应的数的值改为负无穷,然后再将其增加到指定值:是为了可以满足调用函数的先决条件,堆成立,也可以考虑按照本科的做法,将其放到最后一个,向上层递归,直到确定不能更上去。
11. 减少swap成本:先不交换将不和谐的值取出,用父节点的值一个一个填充,到最后可以和谐的时候将最开始的值填入。
12. 记住每次操作后要更新heapsize的值!
13. 一个一个插入的heap和直接构建的heap可能不一样
14. Young氏矩阵,每一行每一列严格单调递增,类似于heap
http://blog.csdn.net/sunmenggmail/article/details/7694771