算法第八章要点

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

18.
key(w)← [w]
19.
end if
20.
if w H then INSERT(H,w)
21.
else SIFTUP(H ,H 1 (w))
22.
end if
23. end for
24. end for
Time Complexity
运行时间主要取决于堆运算:
DELETE: n-1 INSERT: n-1 SIFTUP: m-n+1
Sort (n, v, s); //将各种物品按单位体积价值排序 for ( int i = 1;i <=n; i ++) x[i] = 0; //将解向量初始化为零 float c = M; // 将背包剩余容量初始化为M for ( i =1;i <= n; i ++) {
if ( s[i] > c ) break; x[ i ] = 1; c - = s[ i ]; } if ( i <= n ) x[ i ] = c / s[ i ]; }
5. end if 6. end for
7. for j ← 1 to n - 1
8. 令 y Y,使得 [y]为最小
9. X ← X∪{y} {将顶点 y 加入 X}
10. Y ← Y-{y} {将顶点 y 从 Y 中删除}
11. for 每条边( y,w )
12.
if w Y and [y]+length[y,w]< [w] then
分数背包问题:与0-1背包问题类似,所不 同的是在选择物品i装入背包时,可以选择 物品i的一部分,而不一定要全部装入背包。
首先计算每种物品单位体积的价 值 体v积i /价si,值然最后高将的尽物可品能装多入的背单包位。
Greedy Algorithm
void Knapsack(int n, float M, float v[], float s[], float x[] ) {
1 2
1
0
1
9
12
3 1820
∞4
3
4
15
∞ 197
4
13
6
4
5
5
1∞73
输入: 含权有向图 G = (V,E) ,V = (1,2, ···,n)。
输出: G 中顶点 1 到其他顶点的距离。
1. X={1}; Y ← V-{1}; [1] ← 0
2. for y ← 2 to n
3. if y 相邻于 1 then [y]← length[1,y] 4. else [y]←
11. end for
12. for j ← 1 to n - 1
13. y ← DELETEMIN(H)
14. Y ← Y -{y} {将顶点 y 从 Y 中删除}
15. for 每个邻接于 y 的顶点 w Y
16.
if [y]+length[y,w]< [w] then
17.
[w] ← [y]+length[y,w]
1. Y ← V -{1}; [1] ←0; key(1) ←[1]
2. for y ←2 to n
3. if y 邻接于 1 then
4.
[y]← length[1,y]
5.
key[y] ← [y]
6.
INSERT (H,y)
7. else
8.
[y] ←
9.
key(y) ← [y]
10. eBiblioteka Baidud if
13.
[w] ← [y]+length[y,w]
14. end for
15. end for
问题:如何存储一个有向图?
在算法DIJKSTRA中,当顶点y在第8步中 被选中,如果标记λ(y)是有限的,那么λ(y)= δ(y) 。
Time Complexity
第8步:
执行了n-1次,每次时间是Θ(n) 共需时间Θ(n2)
算法设计技巧与分析
Algorithms Design Techniques and Analysis
南方医科大学医工学院 信息技术系
第8章 贪心算法
Teaching Request
理解贪心算法的基本原理
掌握贪心算法的算法实例(难点) 掌握用贪心算法设计算法的方法(重点)
Content
贪心算法原理 算法实例
堆定义:是一个几乎完全的二叉树,总是保 持父节点的键值不小于子节点的键值。
堆运算:SIFT-UP、SIFT-DOWN、 DELETEMAX、DELETE、INSERT、 MAKEHEAP
输入: 含权有向图 G = (V,E) ,V = (1,2, ···,n)。 输出: G 中顶点 1 到其他顶点的距离,假设已有一个空堆H。
第11步:
for循环执行了m次,m=|E| 共需时间Θ(m)
算法的时间复杂度: Θ(n2+m)
给出一个边具有非负权的有向图 G 和源顶点 s ,算法DIJKSTRA 在时 间 (n 2 ) 内找出从 s 到其它每一顶 点距离的长度。
Amendatory Algorithm
思路:用最小堆数据结构来保持集合Y中的 顶点,使Y组中离V-Y最近的顶点 y可以在 Ο(log n)时间内被选出。
每个堆运算用Ο(log n)时间,得到总共需要 Ο(m log n)时间。
给出具有非负权重的边和源顶点 s 的图 G,算法 SHORTESTPATH 可在 O(mlog n) 时间内找出从 s 到其它每一个顶点的距离。如果图是稠密的, 即对于某个 0, m n1 ,那么它可以被改善
Single Source Shortest Paths
设:G=(V,E)为一个有向图,每一条边都 具有非负长度,有一个特异顶点s称为源。
求:从s到V中每一个其他顶点v的距离,即 最短路径δ(v) 。
假设:V={1,2,…,n},并且s=1。
Base Principle of Dijkstra
单源最短路径问题 最小耗费生成树(Kruskal) 最小耗费生成树(Prim) 文件压缩
Example: Package Problem
0-1背包问题:给定n种物品和一个背包。 物品i的体积是si,其价值为vi,背包的容 量为C。问应如何选择装入背包中的物品, 使得装入背包中物品的总价值最大?
将顶点分为两个集合X和Y,其中X包含的是 距离已经确定的顶点,令λ(y)为Y中顶点y只经 过X中顶点的最短路径的长度,则
1.初始时X={1},Y={2,3,…,n}; 2.从Y中选定距离已经确定的顶点y,将其移至X; 3.更新Y中与y相邻的其他顶点的标记; 4.迭代直至Y为空。
Example
相关文档
最新文档