第9章_蛮力_贪婪法_数据结构与算法.pptx
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
蛮力法:直接基于问题本身描述的算法设计方法 解决问题没有或不用技巧(简单、直接) 简例 已知 a 和非负整数 n,计算 an 的蛮力算法:
a a aa ... a
n n个
典型算法:各种穷举法
优缺点
优点:算法设计简单,易于设计 缺点:算法的时间效率一般不高
3
4
1
C
4
6 5
A
5 6
F
2
D
BC,EF,AB
8
E B
3
4
1
C
4
6 5 8
BC,EF,AB,BF
BC, EF, AB, BF, CF 1 2 3 4 4 AF, DF, AE, CD, DE 5 5 6 6 8
A
5 6
F
2
D
E
B
3
4
1
C
4
BC,EF,AB,BF,DF BC, EF, AB, BF, CF 1 2 3 4 4 AF, DF, AE, CD, DE 5 5 6 6 8
BC, EF, AB, BF, CF 1 2 3 4 4 AF, DF, AE, CD, DE 5 5 6 6 8
A
5 6
F
2
D
E
B
3
4
1
C
4
BC,EF
6 5
A
5 6
F
2
D
8
E
20:42
20/28
B 树中边集 ET 有序候选边集 E BC, EF, AB, BF, CF 不 1 2 3 4 4 唯 AF, DF, AE, CD, DE 一 5 5 6 6 8
20:42
11/28
每一步的决策
是可行解(满足约束条件) 局部最优(贪婪) 不可逆转(后续步骤不能改变它)
优缺点
优点:算法较简单,时空效率较高 缺点:存在视界局限(局部最优不一定是全局最优), 对某些优化问题,不能获得最优解!
负梯度只是局部最好方向, 相邻两次迭代的方向垂直, 整个搜索轨迹呈现锯齿形! 若函数性态很坏,震荡现象 严重,甚至计算不收敛。
20:42
5/28
蛮力法应用 —— 一种重要的算法设计方法
解决各种问题的一般方法 常用于一些很基本又重要的算法 —— 计算 n 个数的和 —— 求数据集的最大元素,…… 可作为尺度,衡量同样问题的其他算法的效率 对于规模不大的问题(蛮力法的速度可以接受时) 蛮力法是一种很好的解决方案! 设计高效算法的代价很可能是不值得的: ① 算法可读性变差,算法实现的复杂性增加 软件工程:不利于软件的开发、测试、维护 ② 时间效率得不到显著的体现
20:42
14/28
子树
12
边缘点 5
v0
2 3 4 7
v*
4 5
u*
边缘点
边缘点
边缘点?
为何加入顶点时,只考虑边缘点? 每个边缘点到子树的最短距离是? 加入子树中的顶点是哪一个?
20:42
15/28
MST 应用例
B
3
4
1
C
4
右图:6 个社区 A ~ F A 5 F 5 D 权值:已测绘的距离 2 6 8 任务:修建道路连通 6 个社区 E 要求:造价成本最低 带权图 G 问题分析:连通性与成本最低要求 ① 连通无环图 (树);② 总里程最短 (MST) 问题求解:选用 Prim 算法 顶点集分 2 个子集:树中顶点集、候选顶点集 顶点增加 2 个属性:树中最近邻接点名称、边长(权) 例如:子树顶点集 { A, B }, F(B, 4) , D(-, ∞)
一个承重量为 W 的背包 求解:能够放入背包(可行)、最有价值的子集 (最优) 连续背包 物品可以按任意比例切分,比例系数 (0.0~1.0) 离散背包(0-1背包) 物品不能切分。0:不放入, 1:放入
0-1背包的蛮力法 (穷举查找)
① 生成 n 个物品集合的全部子集(所有组合) ② 计算每个子集的重量(≤W) ,计算可行解的价值 ③ 最优解:可行解中价值最大者
20:42
6 5
A
5 6
F
2
D
8
E
21/28
单源最短路径问题
给定加权连通图,求一个源点到其余顶点的最短路径 与 MST 区别 —— 整棵树权值和最小(不要求任意两顶点最近) 与 完全最短路径问题区别(Floyd算法) —— 每个顶点到其余顶点的最短路径 与货郎担(旅行商)问题区别 —— 经过带权连通图全部顶点仅一次的最短回路 A 1 B A 1 B A 1 B
穷举查找
① 设计生成算法,生成全部子集(个数:2n ) 幂集
② 对所有子集一一判定是否满足约束条件:
满足的子集:解(可行解) 不满足的子集:不可行解
20:42
9/28
背包问题(Knapsack Problem) 已知:n 个物品,重量 (w1, ..., wn), 价值 (v1, ..., vn),
20:42
19/28
B 树中边集 ET 有序候选边集 E BC, EF, AB, BF, CF 1 2 3 4 4 AF, DF, AE, CD, DE 5 5 6 6 8
3
4
1
C
4
6 5
A
5 6
F
2
D
Φ
8
E B
3
4
1
C
4
6 5 8
BC
BC, EF, AB, BF, CF 1 2 3 4 4 AF, DF, AE, CD, DE 5 5 6 6 8
Data Structures and Algorithms
主讲教师 : 黄襄念 西华大学数学与计算机学院
图像处理与模式识别实验室
课程QQ群:101600501
2/28
20:42
3/28
数学描述
算法设计
数据结构设计 程序设计
20:42
4/28
蛮力法(Brute Force Algorithm)
Kruskal 算法 (克鲁斯卡尔, 避环法)
策略:初始森林开始,逐步合并森林,直到生成 MST 1 Kruskal 算法 // 网G=<V,E,W> B C 4 4 3 6 { O(eloge), e 边数 A 5 F 5 D G 的边集 E 排序:权值小→大 2 初始森林:MST 的边集 ET = Φ 6 8 E while( |ET| <= n-1 ) // MST有多少边? { 从 E 取下一条边 {u, v} ; E = E - {u, v} ; if ({u,v} 与 ET中边不构成回路 ) ET = ET∪{u,v} ; // {u, v} 加入MST } } 判断 u, v 是否属于同一棵树 (极小连通子图)
20:42
12/28
生成树 (Spanning Tree, ST)
包含连通图全部顶点的一个连通无环子图 (边数 = n-1) 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4
最小生成树 (Minimum Spanning Tree, MST)
带权连通图所有生成树中,权重之和最小的那一棵 A 1 B A 1 B A 1 B A 1 B 2 2 2 5 5 5 C 3 D C 3 D w(T1) = 6 3 D w(T2) = 9 C C D w(T3) = 8
3
8
E
B
4
1
C
4
6 5
D( F , 5), E( F , 2)
A
5 6
F
2
D
8
E
A( , ), B( A, 3) C ( B ,1), F ( B , 4) E ( F , 2)
B
D( F , 5)
3
4
1
C
4
6 5
A
5 6
F
2
D
时间效率 O(n2), 与边数无关 适合于稠密图
20:42
8
E
18/28
20:42
10/28
贪婪法/贪心法(Greedy Algorithm)
常用于解决最优化问题
全局最优解由一系列的 局部最优解构成 下山:一步一步走 迭代法,非直接法 最速下山法 从始点出发,根据当前 局部最优决策,使目标 函数 f (X) →min 最快 f (x1,x2) 变化最快方向? —— 梯度方向 (+, -) 正梯度:函数值增大 负梯度:函数值减小
4
C
20:42
2
3 D 带权图 C
2
3 D MST
4
C
2
D
单源最短路径树
22/28
解单源最短路径问题 —— Dijkstra 算法
边缘点 子树 12 5 2 4 2 8 边缘点 非边缘点 5 4
v0
u*
Dijkstra 与 Prim 很类似 Dijkstra: 到起点v0 距离最近 Prim: 到子树距离最近
穷举查找:最近对问题、凸包问题
20:42
7/28
排序算法设计
举例:对线性表 (89, 45, 68, 90, 29, 34, 17) 排为升序 思考:什么是排序问题?最直接的排序方法? 蛮力法:按从小到大顺序挑出各个元素排列好 2 3 4 5 6 n 7 SelectionSort ( A[1...n]) { 45 68 90 29 34 17 for i 1 to n 1 45 68 90 29 34 89 min i 29 68 90 45 34 89 for j i 1 to n 29 34 90 45 68 89 if ( A[ j ] A[min] ) min j 29 34 45 90 68 89 A[ i ] A[min] 29 34 45 68 90 89 } 29 34 45 68 89 90
3
4
6 5
A
5 6
F
2
D
8
E
20:42
17/28
B
3
4
1
C
4
6 5
树中顶点集
A( , ), B( A, 3) C ( B ,1) A( , ), B( A, 3) C ( B ,1), F ( B , 4)
候选顶点集
A
5 6
F
2
D
D(C , 6), E ( A, 6) F ( B , 4) MST 不唯一
6
20:42
16/28
算法过程图例
树中顶点集 初始树 A(, ) 候选顶点集
B ( A, 3), C ( , ) D( , ), E ( A, 6) F ( A, 5)
B
3
4
1
C
4
6 5
A
5 6
F
2
D
8
E B
1
C
4
A(, ), B( A, 3)
C ( B,1), D( , ) E ( A, 6), F ( B, 4)
20:42
13/28
普利姆 (Prim) 算法
策略:初始子树开始,逐步扩展子树,直到生成 MST 算法: ① 初始子树 任选一个顶点 v0 ② 子树扩展(贪婪) 加入顶点:不在树中、到树的距离最近的一个顶点 ○ 顶点到树的距离:到树中所有顶点的最短距离 ③ 算法停止 全部顶点都已加入树中(形成一棵树) 说明:MST不唯一,但权之重和相同 算法过程图:下页
xk (0,1) , k 1, ..., n
0 xk 1
三种贪婪策略 ① 价值贪婪 ② 重量贪婪 ③ 价值/重量贪婪
20:42
24/28
GreedyKnapsack ( n, w[1...n], v[1...n], x[1...n],W ,V ) x[1...n] 0 // 解向量 (空背包) W0 W // 背包的当前承重量 V 0 // 背包中物品总价值 MergeSort (v[1...n] / w[1...n]) // 排序(降序):价值/重量 for ( i 1 to n) do // n个物品循环 if ( w[i ] W0 ) then // 未超重 x[i ] 1 // 整个装入背包:xi = 1 // 背包当前承重量减小 W0 W0 w[i ] // 物品价值记入总价值 V V v[i ] // 物品超重:放入一部分 else x[i ] W0 / w[i ], V V x[ i ] * v[i ] break return V
20:42
6/28
排序问题中的蛮力法
冒泡排序、选择排序
查找问题中的蛮力法
顺序查找、字符串匹配(朴素的)
组合问题中的蛮力法
穷举查找:子集和问题、0-1背包问题
图问题中的蛮力法
穷举查找:哈密顿回路问题 穷举查找:货郎担(旅行商,TSP,邮递员)问题
计算几何问题中的蛮力法
1 89 17 17 17 17 17 17
n( n 1) 2 T ( n) 1 ( n ) 2 i 1 j i 1
n1 n
20:42
8/28
组合问题的查找
前述查找:给定集合中查找满足条件的一个元素 (key) 组合问题的查找:给定集合中查找满足条件的子集 例:子集和问题 在给定的整数集合中,查找满足如下条件的子集: 元素和 = 某个给定的整数 (约束条件) 应用例:食堂就餐(50元钱能买多少食品,不找零)
20:42
23/28
背包问题的数学模型(优化模型)
目标函数ቤተ መጻሕፍቲ ባይዱ
max f ( x ) vk xk
k 1
n
约束条件 0-1 背包 连续背包
w x
k 1 k
n
k
W
n 个物品: 重量: (w1, ..., wn) 价值 : (v1, ..., vn)
背包承重量 : W 物品 k 放入背包的 比例系数: xk
a a aa ... a
n n个
典型算法:各种穷举法
优缺点
优点:算法设计简单,易于设计 缺点:算法的时间效率一般不高
3
4
1
C
4
6 5
A
5 6
F
2
D
BC,EF,AB
8
E B
3
4
1
C
4
6 5 8
BC,EF,AB,BF
BC, EF, AB, BF, CF 1 2 3 4 4 AF, DF, AE, CD, DE 5 5 6 6 8
A
5 6
F
2
D
E
B
3
4
1
C
4
BC,EF,AB,BF,DF BC, EF, AB, BF, CF 1 2 3 4 4 AF, DF, AE, CD, DE 5 5 6 6 8
BC, EF, AB, BF, CF 1 2 3 4 4 AF, DF, AE, CD, DE 5 5 6 6 8
A
5 6
F
2
D
E
B
3
4
1
C
4
BC,EF
6 5
A
5 6
F
2
D
8
E
20:42
20/28
B 树中边集 ET 有序候选边集 E BC, EF, AB, BF, CF 不 1 2 3 4 4 唯 AF, DF, AE, CD, DE 一 5 5 6 6 8
20:42
11/28
每一步的决策
是可行解(满足约束条件) 局部最优(贪婪) 不可逆转(后续步骤不能改变它)
优缺点
优点:算法较简单,时空效率较高 缺点:存在视界局限(局部最优不一定是全局最优), 对某些优化问题,不能获得最优解!
负梯度只是局部最好方向, 相邻两次迭代的方向垂直, 整个搜索轨迹呈现锯齿形! 若函数性态很坏,震荡现象 严重,甚至计算不收敛。
20:42
5/28
蛮力法应用 —— 一种重要的算法设计方法
解决各种问题的一般方法 常用于一些很基本又重要的算法 —— 计算 n 个数的和 —— 求数据集的最大元素,…… 可作为尺度,衡量同样问题的其他算法的效率 对于规模不大的问题(蛮力法的速度可以接受时) 蛮力法是一种很好的解决方案! 设计高效算法的代价很可能是不值得的: ① 算法可读性变差,算法实现的复杂性增加 软件工程:不利于软件的开发、测试、维护 ② 时间效率得不到显著的体现
20:42
14/28
子树
12
边缘点 5
v0
2 3 4 7
v*
4 5
u*
边缘点
边缘点
边缘点?
为何加入顶点时,只考虑边缘点? 每个边缘点到子树的最短距离是? 加入子树中的顶点是哪一个?
20:42
15/28
MST 应用例
B
3
4
1
C
4
右图:6 个社区 A ~ F A 5 F 5 D 权值:已测绘的距离 2 6 8 任务:修建道路连通 6 个社区 E 要求:造价成本最低 带权图 G 问题分析:连通性与成本最低要求 ① 连通无环图 (树);② 总里程最短 (MST) 问题求解:选用 Prim 算法 顶点集分 2 个子集:树中顶点集、候选顶点集 顶点增加 2 个属性:树中最近邻接点名称、边长(权) 例如:子树顶点集 { A, B }, F(B, 4) , D(-, ∞)
一个承重量为 W 的背包 求解:能够放入背包(可行)、最有价值的子集 (最优) 连续背包 物品可以按任意比例切分,比例系数 (0.0~1.0) 离散背包(0-1背包) 物品不能切分。0:不放入, 1:放入
0-1背包的蛮力法 (穷举查找)
① 生成 n 个物品集合的全部子集(所有组合) ② 计算每个子集的重量(≤W) ,计算可行解的价值 ③ 最优解:可行解中价值最大者
20:42
6 5
A
5 6
F
2
D
8
E
21/28
单源最短路径问题
给定加权连通图,求一个源点到其余顶点的最短路径 与 MST 区别 —— 整棵树权值和最小(不要求任意两顶点最近) 与 完全最短路径问题区别(Floyd算法) —— 每个顶点到其余顶点的最短路径 与货郎担(旅行商)问题区别 —— 经过带权连通图全部顶点仅一次的最短回路 A 1 B A 1 B A 1 B
穷举查找
① 设计生成算法,生成全部子集(个数:2n ) 幂集
② 对所有子集一一判定是否满足约束条件:
满足的子集:解(可行解) 不满足的子集:不可行解
20:42
9/28
背包问题(Knapsack Problem) 已知:n 个物品,重量 (w1, ..., wn), 价值 (v1, ..., vn),
20:42
19/28
B 树中边集 ET 有序候选边集 E BC, EF, AB, BF, CF 1 2 3 4 4 AF, DF, AE, CD, DE 5 5 6 6 8
3
4
1
C
4
6 5
A
5 6
F
2
D
Φ
8
E B
3
4
1
C
4
6 5 8
BC
BC, EF, AB, BF, CF 1 2 3 4 4 AF, DF, AE, CD, DE 5 5 6 6 8
Data Structures and Algorithms
主讲教师 : 黄襄念 西华大学数学与计算机学院
图像处理与模式识别实验室
课程QQ群:101600501
2/28
20:42
3/28
数学描述
算法设计
数据结构设计 程序设计
20:42
4/28
蛮力法(Brute Force Algorithm)
Kruskal 算法 (克鲁斯卡尔, 避环法)
策略:初始森林开始,逐步合并森林,直到生成 MST 1 Kruskal 算法 // 网G=<V,E,W> B C 4 4 3 6 { O(eloge), e 边数 A 5 F 5 D G 的边集 E 排序:权值小→大 2 初始森林:MST 的边集 ET = Φ 6 8 E while( |ET| <= n-1 ) // MST有多少边? { 从 E 取下一条边 {u, v} ; E = E - {u, v} ; if ({u,v} 与 ET中边不构成回路 ) ET = ET∪{u,v} ; // {u, v} 加入MST } } 判断 u, v 是否属于同一棵树 (极小连通子图)
20:42
12/28
生成树 (Spanning Tree, ST)
包含连通图全部顶点的一个连通无环子图 (边数 = n-1) 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4
最小生成树 (Minimum Spanning Tree, MST)
带权连通图所有生成树中,权重之和最小的那一棵 A 1 B A 1 B A 1 B A 1 B 2 2 2 5 5 5 C 3 D C 3 D w(T1) = 6 3 D w(T2) = 9 C C D w(T3) = 8
3
8
E
B
4
1
C
4
6 5
D( F , 5), E( F , 2)
A
5 6
F
2
D
8
E
A( , ), B( A, 3) C ( B ,1), F ( B , 4) E ( F , 2)
B
D( F , 5)
3
4
1
C
4
6 5
A
5 6
F
2
D
时间效率 O(n2), 与边数无关 适合于稠密图
20:42
8
E
18/28
20:42
10/28
贪婪法/贪心法(Greedy Algorithm)
常用于解决最优化问题
全局最优解由一系列的 局部最优解构成 下山:一步一步走 迭代法,非直接法 最速下山法 从始点出发,根据当前 局部最优决策,使目标 函数 f (X) →min 最快 f (x1,x2) 变化最快方向? —— 梯度方向 (+, -) 正梯度:函数值增大 负梯度:函数值减小
4
C
20:42
2
3 D 带权图 C
2
3 D MST
4
C
2
D
单源最短路径树
22/28
解单源最短路径问题 —— Dijkstra 算法
边缘点 子树 12 5 2 4 2 8 边缘点 非边缘点 5 4
v0
u*
Dijkstra 与 Prim 很类似 Dijkstra: 到起点v0 距离最近 Prim: 到子树距离最近
穷举查找:最近对问题、凸包问题
20:42
7/28
排序算法设计
举例:对线性表 (89, 45, 68, 90, 29, 34, 17) 排为升序 思考:什么是排序问题?最直接的排序方法? 蛮力法:按从小到大顺序挑出各个元素排列好 2 3 4 5 6 n 7 SelectionSort ( A[1...n]) { 45 68 90 29 34 17 for i 1 to n 1 45 68 90 29 34 89 min i 29 68 90 45 34 89 for j i 1 to n 29 34 90 45 68 89 if ( A[ j ] A[min] ) min j 29 34 45 90 68 89 A[ i ] A[min] 29 34 45 68 90 89 } 29 34 45 68 89 90
3
4
6 5
A
5 6
F
2
D
8
E
20:42
17/28
B
3
4
1
C
4
6 5
树中顶点集
A( , ), B( A, 3) C ( B ,1) A( , ), B( A, 3) C ( B ,1), F ( B , 4)
候选顶点集
A
5 6
F
2
D
D(C , 6), E ( A, 6) F ( B , 4) MST 不唯一
6
20:42
16/28
算法过程图例
树中顶点集 初始树 A(, ) 候选顶点集
B ( A, 3), C ( , ) D( , ), E ( A, 6) F ( A, 5)
B
3
4
1
C
4
6 5
A
5 6
F
2
D
8
E B
1
C
4
A(, ), B( A, 3)
C ( B,1), D( , ) E ( A, 6), F ( B, 4)
20:42
13/28
普利姆 (Prim) 算法
策略:初始子树开始,逐步扩展子树,直到生成 MST 算法: ① 初始子树 任选一个顶点 v0 ② 子树扩展(贪婪) 加入顶点:不在树中、到树的距离最近的一个顶点 ○ 顶点到树的距离:到树中所有顶点的最短距离 ③ 算法停止 全部顶点都已加入树中(形成一棵树) 说明:MST不唯一,但权之重和相同 算法过程图:下页
xk (0,1) , k 1, ..., n
0 xk 1
三种贪婪策略 ① 价值贪婪 ② 重量贪婪 ③ 价值/重量贪婪
20:42
24/28
GreedyKnapsack ( n, w[1...n], v[1...n], x[1...n],W ,V ) x[1...n] 0 // 解向量 (空背包) W0 W // 背包的当前承重量 V 0 // 背包中物品总价值 MergeSort (v[1...n] / w[1...n]) // 排序(降序):价值/重量 for ( i 1 to n) do // n个物品循环 if ( w[i ] W0 ) then // 未超重 x[i ] 1 // 整个装入背包:xi = 1 // 背包当前承重量减小 W0 W0 w[i ] // 物品价值记入总价值 V V v[i ] // 物品超重:放入一部分 else x[i ] W0 / w[i ], V V x[ i ] * v[i ] break return V
20:42
6/28
排序问题中的蛮力法
冒泡排序、选择排序
查找问题中的蛮力法
顺序查找、字符串匹配(朴素的)
组合问题中的蛮力法
穷举查找:子集和问题、0-1背包问题
图问题中的蛮力法
穷举查找:哈密顿回路问题 穷举查找:货郎担(旅行商,TSP,邮递员)问题
计算几何问题中的蛮力法
1 89 17 17 17 17 17 17
n( n 1) 2 T ( n) 1 ( n ) 2 i 1 j i 1
n1 n
20:42
8/28
组合问题的查找
前述查找:给定集合中查找满足条件的一个元素 (key) 组合问题的查找:给定集合中查找满足条件的子集 例:子集和问题 在给定的整数集合中,查找满足如下条件的子集: 元素和 = 某个给定的整数 (约束条件) 应用例:食堂就餐(50元钱能买多少食品,不找零)
20:42
23/28
背包问题的数学模型(优化模型)
目标函数ቤተ መጻሕፍቲ ባይዱ
max f ( x ) vk xk
k 1
n
约束条件 0-1 背包 连续背包
w x
k 1 k
n
k
W
n 个物品: 重量: (w1, ..., wn) 价值 : (v1, ..., vn)
背包承重量 : W 物品 k 放入背包的 比例系数: xk