堆排序

来源:互联网 发布:html class属性 数据库 编辑:程序博客网 时间:2024/05/29 04:43

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


0 0
原创粉丝点击