每一步选择满足条件
可行
局部最优
不可取消
局部最优产生全局最优
证明:
1.数学归纳法,
2.每步不比其他步差
3.到达问题最优上界
或得到近似解
特性问题:找一个数
问题的特征提供更多信息?
全局问题:多次查找
问题的共同特性,特性的最大子集?
拟阵:抽象组合结构
最小生成树
连通图
权重最低
是树!
属性:点=边+1,无圈
Prim算法:单个节点开始,选择离已有图最近的点加入
保持集合:优先队列:未加入的点:离已有树的距离
归纳法:每步构成的树是某棵最小生成树的子图
i-1步符合属性,i步符合
反证:两棵树,已知树,未知树,连接,选最小边
Kruskal:
V-1条边的无环子图
边权重递减,选择最短边,判断是否构成环
判断连通性:并查集:
求并(合并树):两个节点在不同集合
查找(是否连通):两个节点在同一集合(以后可不再考虑该边)
遍历边,分两种情况:连接,成环
并查集操作:
makeset:生成单元素集合
find:所属子集
union:合并集合
集合中元素来索引集合
实现:
链表:元素
元素:所属集合标记
并:短链表加入长链表末尾,修改元素集合标记(维护链表长度)
证明nlogn
树
根:子集代表
节点:元素
集合元素到树中节点的映射:指针数组
并:合并根
find:子——父——根指针链
小树——附加到大树
大小衡量:节点个数,高度
路径压缩:节点直接指向根
Dijkstra
单起点最短路径