堆、Huffman Trees
(一)性质:
- Heap的定义:是一颗完全二叉树,根节点为最大或最小
- 最大堆:任意一个结点值都大于等于任意一个子节点
- 逻辑上:完全二叉树
物理上:数组
堆是一种顺序存储结构(采用数组方式存储)
(二)性质
-
因为是完全二叉树,所以高度最小
-
一个具有n个结点的堆的高度是:
对 [ log(n+1) ]取上整! -
只需要logn层:就可以达到n个节点
-
比较两种构建堆的方法的时间复杂度:
(1)一个一个进行插入,每次插入最差时间代价为logn(从低移动到顶部),插入n个值的时间代价为nlogn
(2)先数组成堆后,依次进行shifdown操作,n个的时间复杂度为n,比(1)好得多,也比建立BST平均时间复杂度nlogn和BST最差时间复杂度n^2好得多。
(二)堆的构造: 数组构造
按照complete tree的方法构造
(三)向堆中添加元素
向堆中插入一个值后进行heapifying:
刚开始可能不满足堆的性质,将该值插到最后一个结点,然后对这个结点进行sift up操作:
即和上一个结点进行交换,一直交换。
(三)取出堆中的最大元素:
取出最大的元素(即根节点),和最后一个元素交换,然后对最后一个元素进行sift down操作
(四)Heapify堆化:就是将任意数组整理成堆的形状,通常的做法是遍历数组从0开始添加创建一个新的堆,把当前数组就看做是一个完全二叉树。
然后从最后一个非叶子结点开始进行Sift Down操作就可以了,最后一个非叶子结点就是最后一个结点的父亲结点
注意:越到层次越浅的结点需要连续交换值
建立Huffman 编码树
1、建立、画图
2、编码表
3、会反编码
4、会求位大小