第9章:贪婪技术——《算法笔记
每一步选择满足条件
可行
局部最优
不可取消
局部最优产生全局最优
证明:
1.数学归纳法,
2.每步不比其他步差
3.到达问题最优上界
或得到近似解
特性问题:找一个数
问题的特征提供更多信息?
全局问题:多次查找
问题的共同特性,特性的最大子集?
拟阵:抽象组合结构
最小生成树
连通图
权重最低
是树!
属性:点=边+1,无圈
Prim算法:单个节点开始,选择离已有图最近的点加入
保持集合:优先队列:未加入的点:离已有树的距离
归纳法:每步构成的树是某棵最小生成树的子图
i-1步符合属性,i步符合
反证:两棵树,已知树,未知树,连接,选最小边
Kruskal:
V-1条边的无环子图
边权重递减,选择最短边,判断是否构成环
判断连通性:并查集:
求并(合并树):两个节点在不同集合
查找(是否连通):两个节点在同一集合(以后可不再考虑该边)
遍历边,分两种情况:连接,成环
并查集操作:
makeset:生成单元素集合
find:所属子集
union:合并集合
集合中元素来索引集合
实现:
链表:元素
元素:所属集合标记
并:短链表加入长链表末尾,修改元素集合标记(维护链表长度)
证明nlogn
树
根:子集代表
节点:元素
集合元素到树中节点的映射:指针数组
并:合并根
find:子——父——根指针链
小树——附加到大树
大小衡量:节点个数,高度
路径压缩:节点直接指向根
Dijkstra
单起点最短路径
不含负权重
维护:已构成树,与剩余节点的距离
选距离最近的点
更新树与点集的距离
斐波那契堆?理论上的改进
哈弗曼树与编码
变长编码
字符出现频率
单节点树:根:树的权重:频率和
选两个最小频率,合并,新根:频率和
压缩率
动态哈夫曼编码
n个正数分配给叶节点
每步:最小加权长度all(hxw),合并
最小加权树
猜数字游戏,每次奖金减半
习题:
1.