学习过程主要依照中国MOOC课程,感谢MOOC,感谢浙大授课大佬。
堆heap
什么是堆
堆的两个特性:
- 结构性:用数组表示的完全二叉树
- 有序性:任一结点的关键字是其子树所有结点的最大值(或最小值)
堆进行的操作
创建、插入、删除、判断是否已满是否为空,返回最大值最小值
1 | typedef struct HNode *Heap; /* 堆的类型定义 */ |
哈夫曼树与哈夫曼编码
什么是哈夫曼树
根据结点不同的查找频率来构造更有效的搜索树。
带权路径长度(WPL):设二叉树有n个叶子结点,每个叶子结点带有权值wK,从根结点到每个叶子结点的长度为lK,则每个叶子结点的带权路径长度之和就是:WPL= wK*lK从i到k的求和。
哈夫曼树(最优二叉树):WPL最小的二叉树。
哈夫曼树的构造
把权值从小到大进行排序,把权值最小的两个并在一起,形成一棵二叉树,每次把权值最小的两棵二叉树合并。
哈夫曼树的特点
- 没有度为1的结点;
- n个叶子结点的哈夫曼树共有2n-1个结点;
- 哈夫曼树的任意非叶子结点的左右子树交换后仍是哈夫曼树;
- 对于同一组权值,存在不同构的两棵哈夫曼树;
哈夫曼编码
用二叉树进行编码时如何避免二义性:
- 左右分支:0,1
- 字符只在叶结点上
利用哈夫曼树进行编码就是哈夫曼编码。
集合及运算
集合运算:交、并、补、差
并查集:集合并、查某元素属于什么集合
集合的表示
可以用树结构表示集合,树的每个结点代表一个集合元素
集合运算
- 查找某个元素所在的集合;
- 集合的并运算
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#define MAXN 1000 /* 集合最大元素个数 */
typedef int ElementType; /* 默认元素可以用非负整数表示 */
typedef int SetName; /* 默认用根结点的下标作为集合名称 */
typedef ElementType SetType[MAXN]; /* 假设集合元素下标从0开始 */
void Union( SetType S, SetName Root1, SetName Root2 )
{ /* 这里默认Root1和Root2是不同集合的根结点 */
/* 保证小集合并入大集合 */
if ( S[Root2] < S[Root1] ) { /* 如果集合2比较大 */
S[Root2] += S[Root1]; /* 集合1并入集合2 */
S[Root1] = Root2;
}
else { /* 如果集合1比较大 */
S[Root1] += S[Root2]; /* 集合2并入集合1 */
S[Root2] = Root1;
}
}
SetName Find( SetType S, ElementType X )
{ /* 默认集合元素全部初始化为-1 */
if ( S[X] < 0 ) /* 找到集合的根 */
return X;
else
return S[X] = Find( S, S[X] ); /* 路径压缩 */
}
以上。
注:转载文章请注明出处,谢谢~