JUFE • SSCE__Dr. Aihua Yin

Slides:



Advertisements
Similar presentations
励步英语授权流程.
Advertisements

清仓处理 跳楼价 满200返160 5折酬宾.
算法设计与分析 授课教师:王秋芬 办公地点:7307
最大团问题 回溯法应用 作者:余新华 时间:
第5章 定积分及其应用 基本要求 5.1 定积分的概念与性质 5.2 微积分基本公式 5.3 定积分的换元积分法与分部积分法
七 年 级 数 学 第二学期 (苏 科 版) 复习 三角形.
探索三角形相似的条件(2).
初中数学八年级下册 (苏科版) 10.4 探索三角形 相似的条件(2).
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
Chapter9 Priority Trees
强连通分量 无向图 1、任意两顶点连通称该图为连通图 2、否则将其中的极大连通子图称为连通分量 A D C B E 有向图
SOA – Experiment 3: Web Services Composition Challenge
第七章 图 东南大学计算机学院 方效林 本课件借鉴了清华大学殷人昆老师 和哈尔滨工业大学张岩老师的课件.
走进编程 程序的顺序结构(二).
第2讲 绪论(二).
临界区软件互斥软件实现算法.
第五讲 四则运算计算器(一) 精品教程《C#程序设计与应用(第2版)清华大学出版社 谭恒松 主编
第4章 非线性规划 一维搜索方法 2011年11月.
What have we learned?.
动态规划(Dynamic Programming)
使用矩阵表示 最小生成树算法.
无向树和根树.
第4章 非线性规划 4.5 约束最优化方法 2019/4/6 山东大学 软件学院.
专题作业.
知识点回顾 拓扑排序 关键路径 应用领域、求解步骤、算法实现过程 应用领域 求解步骤
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
学习目标 1、什么是字符集 2、字符集四个级别 3、如何选择字符集.
实数与向量的积.
线段的有关计算.
算法设计与分析 ——贪心法. 算法设计与分析 ——贪心法 贪心算法 主要内容: 介绍贪心法的基本原理,贪心算法设计的基本方法和应用例子 。
顺序表的删除.
第四章 四边形性质探索 第五节 梯形(第二课时)
WPT MRC. WPT MRC 由题目引出的几个问题 1.做MRC-WPT的多了,与其他文章的区别是什么? 2.Charging Control的手段是什么? 3.Power Reigon是什么东西?
12.2全等三角形的判定(2) 大连市第三十九中学 赵海英.
复习.
图论初步 柏钧文.
信号量(Semaphore).
定理21.9(可满足性定理)设A是P(Y)的协调子集,则存在P(Y)的解释域U和项解释,使得赋值函数v(A){1}。
iSIGHT 基本培训 使用 Excel的栅栏问题
§6.7 子空间的直和 一、直和的定义 二、直和的判定 三、多个子空间的直和.
知识点回顾 图的深度优先和广度优先遍历思想 图的深度优先遍历算法(用邻接表作为存储结构) 图的广度优先遍历算法(用邻接矩阵作为存储结构)
3.16 枚举算法及其程序实现 ——数组的作用.
1.设A和B是集合,证明:A=B当且仅当A∩B=A∪B
树和图 tree and graph 蔡亚星.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
第 四 章 迴歸分析應注意之事項.
第七、八次实验要求.
JUFE • SCES__Dr. Aihua Yin
第七章 价值工程.
2.2矩阵的代数运算.
临界区问题的硬件指令解决方案 (Synchronization Hardware)
分数再认识三 真假带分数的练习课.
第15讲 特征值与特征向量的性质 主要内容:特征值与特征向量的性质.
正弦、余弦函数的性质 华容一中 伍立华 2017年2月24日.
生 物 信 息 学 Bioinformatics 巩晶 癌症研究中心 山东大学 医学院
动态规划 Floyd最短路径算法 高文宇
最小生成树.
异分母分数加、减法.
第四节 向量的乘积 一、两向量的数量积 二、两向量的向量积.
线性规划 Linear Programming
插入排序的正确性证明 以及各种改进方法.
创建、启动和关闭Activity 本讲大纲: 1、创建Activity 2、配置Activity 3、启动和关闭Activity
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
中三級專題研習 題目:本校學生環保意識薄弱 3D.
§4.5 最大公因式的矩阵求法( Ⅱ ).
顺序结构程序设计 ——关于“字符串”和数值.
最小生成树 最优二叉树.
§2 自由代数 定义19.7:设X是集合,G是一个T-代数,为X到G的函数,若对每个T-代数A和X到A的函数,都存在唯一的G到A的同态映射,使得=,则称G(更严格的说是(G,))是生成集X上的自由T-代数。X中的元素称为生成元。 A变, 变 变, 也变 对给定的 和A,是唯一的.
3.3.2 两点间的距离 山东省临沂第一中学.
9.3多项式乘多项式.
Presentation transcript:

JUFE • SSCE__Dr. Aihua Yin 第5章 贪心算法 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 考核方式调整 1、每周收取上周的 手绘 算法流程图描述,每次计 2 分 2、每月收取 2个 算法 实现的程序,每次记 6 分 3、期末完成大作业,记 40分 4、课堂点名记 10分,其他分数稍作调整 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin Content 贪心算法原理 算法实例 单源最短路径问题 最小耗费生成树(Kruskal) 最小耗费生成树(Prim) 文件压缩 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 小样例:背包问题 0-1背包问题: 给定 n 种物品和一个背包。物品 i 的体积是vi,其价值为 si,背包的容量为 C。应如何使得装入背包中物品的总价值最大? 普通背包问题: 可以选择物品 i 的一部分装入背包。 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 贪心算法思路 对普通背包问题而言,计算每种物品单位体积的价值 yi = si / vi 将尽可能多的单位体积价值最高的物品装入背包。 两个自然要做的事情是: 1、计算 yi ,i = 1, 2, …, n 2、给 yi 排序 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 贪心算法 对普通背包问题而言,计算每种物品单位体积的价值 yi = si / vi 将尽可能多的单位体积价值最高的物品装入背包。 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin … un v1 v2 v3 … vn s1 s2 s3 … sn y1 y2 y3 … yn yi = si / vi, i = 1, 2, 3, …, n Y1  Y2  Y3  …  Yn yi i1 i2 i3 … in JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin void Knapsack(int n, int M, int V[], int S[], int X[], f Y[]){ Sort(n, V, S, Y); //将各种物品按单位体积价值排序 int i; for(i=1; i<=n; i++) X[i] = 0; //将解向量初始化为零 int C = M; // 将背包剩余容量初始化为 M for(i=1; i<=n; i++){ if( V[i]>C ) break; X[i] = 1; C -= V[i]; } if(i<=n) X[i] = C/V[i]; JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 注意下标的对应关系! 算法正确吗? 考察 C 的单位空间的物品价值,就不难证明其正确性! 贪心算法就是一个局部搜索! JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 单源最短路径问题 设:G = (V, E) 为一个有向图,每一条边都具有非负长度,有一个特异顶点 s 称为源。 求:从 s 到 V 中每一个其他顶点 v 的距离,即最短路径 d(v) 。 假设:V = {1, 2, …, n},并且 s = 1。 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 实例 3 2 1 6 4 5 7 3 & 10 7 12 11 6 1 8 4 9 2 5 13 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin Dijkstra 算法的基本思想 一开始,将顶点分为两个集合 X 和 Y,其中 X 包含的是距离已经确定的顶点, Y 则相反。令 λ(y) 为 Y 中顶点 y 只经过 X 中顶点的最短路径的长度,则 初始时 X = {1},Y = {2, 3, …, n}; 从 Y 中选定距离已经确定的顶点 y,移至 X; 更新 Y 中与 y 相邻的其他顶点的标记,找出该值最小者; 迭代直至 Y 为空。 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin “钓鱼”算法 站位——确定 y 下饵——更新标记 咬钩——选中最小标记顶点 起竿、入篓——被选中的顶点进入“已确定距离的点集” JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 小样例 1 ∞ 4 1 2 3 4 5 6 12 9 13 15 17 19 ∞ ∞ 10 12 8 17 13 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin Dijkstra 算法步骤 输入: 含权有向图 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] = 5. end if 6. end for JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 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 ) , wY 12. [w] > [y] + length(y, w) then 13. [w] = [y] + length(y, w) 14. end for 15. end for JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 引理 在 Dijkstra 算法中,设顶点 y 在第 8 步中被选中,如果标记 [y] 是有限的,那么 [y] = d[y] 任务:画出 Dijkstra 算法流程图,编写其代码 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 时间复杂度 第8步: 执行了 n-1 次,每次时间是 Θ(n) 共需时间 Θ(n2) 第11步: For 循环执行了m 次,m = |E| 共需时间 Θ(m) 算法的时间复杂度: Θ(n2+m) JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 定理 1 给出一个边具有非负权的有向图 G 和源顶点 s,Dijkstra 算法在时间 θ(n2)内找出从 s 到其他每一顶点 距离的长度。 有人想过 Dijkstra 算法的 Step8 中,如果有多个 y 满足被选中条件,算法该如何进行吗? 对算法的任何小小质疑都意味着进步!!! JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin Dijkstra算法改进 思路:用最小堆数据结构来保持集合Y 中的顶点,使 Y 组中离V-Y 最近的顶点 y 可以在 O(log n) 时间内被选出。 堆定义:是一个几乎完全的二叉树,总是保持父节点的键值不小于子节点的键值。 堆运算:SIFT-UP、SIFT-DOWN、 DELETEMAX、DELETE、INSERT、MAKEHEAP JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 输入: 含权有向图 G = (V,E) ,V = (1,2, ··· ,n)。 输出: G 中顶点 1 到其他顶点的距离,假设已有一个空堆H。 1. Y = V -{1}; [1] = 0; key(1) = [1] 2. for y ←2 to n DG Dijkstra 算法 3. if y 邻接于 1 then 4. [y]= length(1,y); key (y) = [y] 5. INSERT (H,y) 6. else 8. [y] = ; key (y) = [y] 9. end if 10. end for JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 11. for j = 1 to n - 1 12. y = DELETEMIN(H) 13. Y = Y -{y} // 将顶点 y 从 Y 中删除 14. for 每个邻接于 y 的顶点 w Y 15. if [y] + length(y, w) < [w] then 16. [w]= [y] + length( y ,w); key (y) = [y] 17. end if 18. if w H then INSERT(H,w) 19. else SIFT-UP( H ,POSIT-1 (w)) 20. end if 21. end for 22. end for JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 时间复杂度 运行时间主要取决于堆运算: DELETE: n-1 INSERT: n-1 SIFT-UP: m-n+1 每个堆运算用 Ο(log n) 时间,得到总共需要Ο(m log n) 时间。 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 堆排序: 建堆 j = , …, 1 while i = 1, …, n-1 对换节点 k = n+1-i 与节点 k = 1 Sift-down(H-i, 1) // 序列最后的 i 个元素已经排好序 end while return JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 堆的运算——上筛 Sift-up(H, i) 目标:上移 H[i] 使得它的键值不大于其父节点的 flag = 0; if(i = 1) then exit; //节点 i 为根节点 while i = 1 or flag = 1 if( H(i) > H( ) ) then 对换这两个节点 else flag = 1 i = end while return JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 堆的运算——下筛 Sift-down(H, i) 目标:下移 H[i] 使得它的键值不大于其父节点的 flag = 0; if( 2i > n ) then exit; //节点 i 为叶子节点 while 2i > n or flag = 1 i = 2i if (i+1n && H(i+1) > H( i ) ) then i = i+1 if( H(i) > H( ) ) then 对换这两个节点 else flag = 1 end while return JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 堆的运算——插入 Insert(H, x) 目标:向堆 H 中插入一个元素 x n = n+1; //增加 H 的大小 H[n] = x Sift-up(H, n) JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 堆的运算——删除 Delete(H, i) 目标:删除堆中元素 H[i] x = H[i]; y = H[n]; n = n-1 //减少 H 的大小 if( i=n+1) then exit; H[i] = y if( yx ) then Sift-up( H, i ) else Sift-down( H, i ) end if JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 堆的运算——删除最大值 DeleteMax( ) 目标:删除堆中最大元素 x x = H[1]; n = n-1 //减少 H 的大小 delete( H, 1) H[i] = y return x JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 堆的运算——建堆 MakeHeap(A) 目标:将一个 n 元数组 A,转化为一个堆 for i = down to 1 Sift-down( A, i ) end for JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 定理 2——高级论题 给出具有非负权重的边和源顶点 s 的图 G, “DG Dijkstra 算法”可在 O(mlogn) 时间内找出从 s 到其他每一顶点的距离。 如果 图是稠密的,即对于某个  > 0,m  n1+,那么它可以被改善为在时间 O(m /) 内运行。 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 最小生成树问题 设 G = (V, E) 是一个具有加权边的连通无向图。G 的一棵生成树 (V,T) 是 G 的作为树的子图。 如果给 G 加权并且 T 的各边的权的和为最小值,那么 (V, T) 就称为 最小耗费生成树,或简称为 最小生成树。 问题背景:设计要求:在 n 个城市之间建设网络,只需保证连通即可,求最经济的架设方法。 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin Kruskal 算法概要 假设:G 为连通的; 基本步骤: 设 (V,T) 为当前构建的森林,其初始为 (V, {}); 对 G 的边以非降序权重排列; 按序考察每一条边 e,如果把 e 加入T 中不会构成回路,则加入;否则丢弃。 迭代直至 |T| = n-1。 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 算例 1 2 3 4 5 6 11 9 13 7 1 2 3 4 5 6 1 3 9 2 4 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin Kruskal 算法描述 输入: 包含 n 个顶点的加权连通无向图 G =(V,E)。 输出: 由 G 生成的最小耗费生成树 T 组成的边的集合。 1. 按非降序权重将 E 中的边排序 2. for 每个顶点 v V 3. MAKESET( {v} ) 4. end for JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 5. T = { } 6. while |T| < n - 1 7. 令 (x,y) 为 E 中的下一条边 8. if FIND(x) ≠ FIND(y) then 9. 将 (x,y) 加入 T 10. UNION (x,y) 11. end if 12. end while JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin Kruskal 算法实现关键处 1. Step 1 中,排好序的边的集合 如何存储? 2. Step 3 中, MAKESET( {v} ) 的含义是什么? 3. Step 8 中, FIND(x) 与 FIND(y) 的含义是什么? 4. Step 10 中, UNION (x,y) 的含义是什么? JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin Kruskal 算法实现提示 1. Step 1 中,排好序的边的集合 存储:点对,二维数组 2. Step 3 中, MAKESET( {v} ) 的含义:森林,一维数组 3. Step 8 中, FIND(x) 与 FIND(y) 的含义: 顺着下标找 4. Step 10 中, UNION (x,y) 的含义:联合森林成树 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 边按权重排序如下 (边起点,边终点,边权重) 1 2 3 4 5 6 11 9 13 7 (1, 2, 1) (1, 3, 2) (4, 6, 3) (5, 6, 4) (2, 3, 6) (4, 5, 7) (3, 4, 9) (2, 4, 11) (3, 5, 13) 最小支撑树边集 T={ } 1 2 3 4 5 6 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 边按权重排序如下(边起点, 边终点, 边权重) :(1,2,1), (1,3,2),(4,6,3),(5,6,4),(2,3,6),(4,5,7),(3,4,9),(2,4,11),(3,5,13) 考察边(1,2,1) (Find(1)=1)≠(Find(2)=2) T={(1,2,1)} Union(1,2) 1 2 3 4 5 6 ② 2 ① ③ ④ ⑤ ⑥ 考察边(1,3,2) (Find(1)=2)≠(Find(3)=3) T={(1,2,1),(1,3,2)} Union(1,3) 1 2 3 4 5 6 ② 2 ① ③ ④ ⑤ ⑥ JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 边按权重排序如下(边起点, 边终点, 边权重) :(1,2,1), (1,3,2),(4,6,3),(5,6,4),(2,3,6),(4,5,7),(3,4,9),(2,4,11),(3,5,13) 考察边(4,6,3) (Find(4)=4)≠(Find(6)=6) T={(1,2,1),(1,3,2),(4,6,3)} Union(4,6) 1 2 3 4 5 6 2 6 ② ⑥ ① ③ ④ ⑤ JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 边按权重排序如下(边起点, 边终点, 边权重) :(1,2,1), (1,3,2),(4,6,3),(5,6,4),(2,3,6),(4,5,7),(3,4,9),(2,4,11),(3,5,13) 考察边(5,6,4) (Find(5)=5)≠(Find(6)=6) T={(1,2,1),(1,3,2),(4,6,3),(5,6,4)} Union(5,6) 1 2 3 4 5 6 1 2 3 4 5 6 2 6 2 6 ② ⑥ ② ⑥ ① ③ ④ ⑤ ① ③ ④ ⑤ JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 边按权重排序如下(边起点, 边终点, 边权重) :(1,2,1), (1,3,2),(4,6,3),(5,6,4),(2,3,6),(4,5,7),(3,4,9),(2,4,11),(3,5,13) 考察边(2,3,6) (Find(2)=2)=(Find(3)=2) 丢弃边 (2,3,6) T={(1,2,1),(1,3,2),(4,6,3),(5,6,4)} 1 2 3 4 5 6 2 6 ② ⑥ ① ③ ④ ⑤ JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 边按权重排序如下(边起点, 边终点, 边权重) :(1,2,1), (1,3,2),(4,6,3),(5,6,4),(2,3,6),(4,5,7),(3,4,9),(2,4,11),(3,5,13) 考察边(4,5,7) (Find(4)=6)=(Find(5)=6) 丢弃边(4,5,7) T={(1,2,1),(1,3,2),(4,6,3),(5,6,4)} 1 2 3 4 5 6 2 6 ② ⑥ ① ③ ④ ⑤ JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 边按权重排序如下(边起点, 边终点, 边权重) :(1,2,1), (1,3,2),(4,6,3),(5,6,4),(2,3,6),(4,5,7),(3,4,9),(2,4,11),(3,5,13) 考察边(3,4,9) (Find(3)=2)≠(Find(4)=6) T={(1,2,1),(1,3,2),(4,6,3),(5,6,4),(3,4,9)} Union(3, 4) 1 2 3 4 5 6 1 2 3 4 5 6 2 6 2 6 ⑥ ② ⑥ ② ④ ⑤ ① ③ ① ③ ④ ⑤ JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 思考? 如何实现 Step 8 中, FIND(x) 与 FIND(y) ? 讨论尝试如何分支完成? 如何实现 Step 10 中, UNION (x,y) ? 任务与要求 数据标准:节点数 > 10,边数 > 100 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 时间复杂度 第1步:O(m log m) 第2步:Θ(n) While循环: 第7步: Θ(n) 第8步: O(m) 第10步:Θ(n) 算法时间:O(m log m) JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 定理 在一个有 m 条边的加权无向图中,算法 Kruskal 可以在 O(m logm) 时间内找出最小耗费生成树 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin Prim 算法 与算法 Kruskal 完全不同。 与算法 Dijkstra 非常相似。 其改进算法也与 ShortestPath 算法类似。 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin PRIM 算法的基本思想 1. T ={}; X = {1}; Y = V-{1}; 2. while Y ≠{} 3. 设 (x, y) 是最小权重的边,其中,xX, yY 4. X = X ∪ { y } 5. Y = Y - { y } 6. T = T ∪ { (x, y) } 7. end while JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 实例 11 9 1 ∞ 2 4 11 1 3 ∞ 1 6 9 7 6 3 2 4 13 3 5 ∞ 13 2 2 4 7 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin Prim 算法步骤 输入: 含权有向图 G = (V,E) ,V = (1,2, ··· ,n)。 输出: G 中顶点 1 到其他顶点的距离(已有一个空堆H) 1. T ← { }; X ←{1}; Y ← V - {1} 2. for y ←2 to n 3. if y 邻接于 1 then // 这是扫描,站在 “1” 处 4. N[y]← 1 // 这是“反制”,y 将作用于 1 5. C[y] ← c [y,1] //体现“反制”,刷标签 6. else C[y] ← //“反制”失效,标个“无穷” 7. end if 8. end for JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 9. for j ← 1 to n – 1 //寻找 n – 1 条边 10. 令 y  Y ,使得 C[y] 最小 11. T ← T ∪ {(y,N[y])} //将边 (y, N[y]) 加入T 12. X ← X ∪ {y} // 将顶点 y 加入 X 13. Y ← Y – {y} // 从 Y 删除顶点 y 14. for 每个邻接于 y 的顶点 w  Y ///扫描,立足点 y 15. if c[y,w] < C[w] then //“反制”、“贴标签”有条件! 16. N[w] ← y 17. C[w] ← c[y,w] 18. end if 19. end for 20. end for JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 定理 在一个有 m 条边的加权无向图中,算法 PRIM 可以在 Θ(n2) 时间内找出最小耗费生成树 课堂练习:用PRIM算法求右图的最小耗费生成树 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 答案: JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 算法MST 步骤 下面讨论算法MST 输入: 含权连通无向图 G = (V,E) ,V = (1,2, ··· ,n)。 输出: 由 G 生成的最小耗费生成树 T 组成的边的集合。 1. T ← {}; Y ← V - {1} 2. for y ←2 to n 3. if y 邻接于 1 then 4. N[y]← 1 5. key[y] ← c [1,y] 6. INSERT(H,y) 7. else key[y] ← 8. end if 9. end for JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 10. for j ← 1 to n – 1 //查找 n – 1 条边 11. y ← DELETEMIN(H) 12. T ← T ∪ {(y,N[y])} //将边(y,N[y])到T 13. Y ← Y – {y} //从 Y 删除顶点 y 14. for 每个邻接于 y 的顶点 w  Y 15. if c[y,w] < key[w] then 16. N[w] ← y 17. key[w] ← c[y,w] 18. end if 19. if w H then INSERT(H,w) 20. else SIFTUP(H,H-1(w) ) 21. end for 22. end for JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 定理 在一个有 m 条边的加权无向图中,算法 MST 可以在 O( m logn) 时间内找出最小耗费生成树。 如果 图是稠密的,即对于某个  > 0,m  n1+,那么它 可以被改善为在时间 O(m /) 内运行。 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 文件压缩问题 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 方法1:定长比特数表示每个字符 方法2:变长比特数表示每个字符 频度大的字符用短编码 频度小的字符用长编码 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin Prefix Restriction 一个字符的编码不能是另一个字符编码的前缀。 例如:若字符a的编码是01, 则字符b就不能编码为010, 否则当遇到01时,无法判断。 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin Huffman 编码 C={a,b,c,d,e} f(a)=20 f(b)=7 f(c)=10 f(d)=4 f(e)=18 编码 a=01,b=110,c=10,d=111,e=00 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 基本原理: 总是选择频度最小的两个节点ci和cj构建一个新节点c,c为ci和cj的父节点,其频度为两个子节点的频度和。 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 满二叉树: 内部节点都恰好有两个分支,标记为0和1 树叶对应于文件中的字符 从根到叶的每一条路径上的0和1的序列对应相关字符的编码 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 2. V = C ; T = {} 3. for j = 1 to n - 1 4. c = DELETEMIN(H) 5. c' = DELETEMIN(H) 6. f(v)=f(c) + f(c') //v是一个新节点 7. INSERT(H,v) 8. V = V∪{v} //添加 v 到 V T=T∪{(v,c),(v,c')} //使 c 和 c' 成为 T 中 v 的孩子 10. end for JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 课堂练习: 假设一个文本文件TFile中只包含7个字符{A,B,C,D,E,F,G},这7个字符在文本中出现的次数为{5,24,7,17,34,5,13},利用哈夫曼树可以为文件TFile构造出符合前缀编码要求的不等长编码。 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 答案: JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 贪心算法特征 贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。 即使贪心算法不能得到整体最优解,其最终结果却是 最优解的很好近似。 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 影响因素 贪心选择性质 对一个具体问题,必须证明每一步所作的贪心选择最 终导致问题的一个整体最优解。 贪心选择后,问题简化为规模更小的类似子问题【最 优子结构性质】。 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin 最优子结构性质 一个问题的最优解包含着它的子问题的最优解, 称此问题具有最优子结构性质。 JUFE • SSCE__Dr. Aihua Yin 2019/4/16

JUFE • SSCE__Dr. Aihua Yin GA 和 DP的区别 都具有最优子结构性质。 动态规划算法,每步所作的选择往往依赖于相关子 问题的解,只有解出相关子问题才能作出选择。 贪心算法,仅在当前状态下作出最好选择,即局部 最优选择,但不依赖于子问题的解。 JUFE • SSCE__Dr. Aihua Yin 2019/4/16