树
1 堆(heap)
1.1 什么是堆
需要2个基本操作:插入;取出一个最大(小)值
搜搜树的优点:插入节点与树的高度有关系;删除节点,即删除最大值或最小值,要么在最左边要么在最右边,所以搜索树不论是插入还是删除的时间效率都是树的高度
如果每次都删除最大的,则每次都删除最右边的节点,导致树歪掉了,树的高度就不再是log2n,所有不用二叉搜索树
如何让结构平衡一点,最好的方法就是用完全二叉树
堆的一个特点:使用完全二叉树存储,任何节点都比它的左右子树的值大
1.2 堆的抽象数据类型描述
1.3 最大堆的操作
创建
堆的第一个数据的存放是从数组下标为1的位置开始的,下标为0的作为哨兵
插入35后有序性被破环了,35>31,所以要进行调整
将35与31的位置互换
插入58后,58>31,58与31互换
换完之后,58>44,58与44互换
插入
当比到下标为1时,不需要再继续往前比了,因此
for(;H->Elements[i/2]<item && i>1;i/=2)
H->Elements[i]=H->Elements[i/2];
//每次把节点和item比较,若小于,则把它的值赋给它的子节点
而如果有哨兵,H->Elements[0]=MaxData,则不用考虑上述的加一个条件
删除
删除最大值即删除53
删除后
把最后一个值31拷贝到根节点
Parent2<=H->size:判断是否有左儿子
Child=Parent2:假设左儿子最大
然后进行判断,找出最大的那个儿子
child!=H->size:确保他有右儿子
最大堆的建立
上图不是堆需要调整
倒数第一个有儿子的节点,其左儿子或右儿子均只有1个,所以这一块可以调整为堆
然后依次调整前面的节点
2 哈夫曼树与哈夫曼编码
2.1 什么是哈夫曼树
2.2 哈夫曼树的构造
如何选取2个最小的?
- 堆
- 排序
一共循环N次,每次不超过logN
2.3 哈夫曼编码
代价最小且无二义性
3 集合及运算
3.1 集合的表示
3.2 集合运算
示例:找2,5
不断地union,会使树越来越高,find效率逐渐降低,所以有以下方案:(但是需要知道树中节点的个数)
既然根节点的Parent不需要特别强调,那么就可以把它改成树的节点个数
b挂a上