算法设计与分析 第4章-part1
算法设计与分析第四章课件
}
若被检查的活动i的开始时间Si小于最近选择 的活动j的结束时间fi,则不选择活动i,否则 选择活动i加入集合A中。
由于输入的活动以其完成时间的非减序排列, 所以算法每次总是选择具有最早完成时间的相 容活动加入集合A中。直观上,按这种方法选 择相容活动为未安排活动留下尽可能多的时间。 也就是说,该算法的贪心选择的意义是使剩余 的可安排时间段极大化,以便安排尽可能多的 相容活动。 算法的效率极高。当输入的活动已按结束时间 的非减序排列,算法只需θ (n)的时间安排n个 活动,使最多的活动能相容地使用公共资源。 如果所给出的活动未按非减序排列,可以用 θ (nlogn)的时间重排。
贪心算法的基本要素
最优子结构
当一个问题的最优解包含其子问题的最优解 时,称此问题具有最优子结构性质。问题的 最优子结构性质是该问题可用动态规划算法 或贪心算法求解的关键特征。
贪心算法与动态规划算法的差异
贪心算法和动态规划算法都要求问题具 有最优子结构性质,这是两类算法的一 个共同点。但是,对于具有最优子结构 的问题应该选用贪心算法还是动态规划 算法求解?是否能用动态规划算法求解的 问题也能用贪心算法求解?
1 i n
All 0
All 0
因此,(y1,y2,…,yn)是一个满足贪心选择性质的最优解。
然后,证明该问题具有最优子结构性质。
设(x1,x2,…,xn)是最优装载问题的一个满足贪心选择 性质的最优解,则x1=1,(x2,…,xn)是轮船载重为cw1且待装船集装箱为{2,3,…,n}时相应最优装载问 题的一个最优解。
算法分析与设计教程习题解答_秦明
算法分析与设计教程习题解答第1章 算法引论1. 解:算法是一组有穷的规则,它规定了解决某一特定类型问题的一系列计算方法。
频率计数是指计算机执行程序中的某一条语句的执行次数。
多项式时间算法是指可用多项式函数对某算法进行计算时间限界的算法。
指数时间算法是指某算法的计算时间只能使用指数函数限界的算法。
2. 解:算法分析的目的是使算法设计者知道为完成一项任务所设计的算法的优劣,进而促使人们想方设法地设计出一些效率更高效的算法,以便达到少花钱、多办事、办好事的经济效果。
3. 解:事前分析是指求出某个算法的一个时间限界函数(它是一些有关参数的函数);事后测试指收集计算机对于某个算法的执行时间和占用空间的统计资料。
4. 解:评价一个算法应从事前分析和事后测试这两个阶段进行,事前分析主要应从时间复杂度和空间复杂度这两个维度进行分析;事后测试主要应对所评价的算法作时空性能分布图。
5. 解:①n=11; ②n=12; ③n=982; ④n=39。
第2章 递归算法与分治算法1. 解:递归算法是将归纳法的思想应用于算法设计之中,递归算法充分地利用了计算机系统内部机能,自动实现调用过程中对于相关且必要的信息的保存与恢复;分治算法是把一个问题划分为一个或多个子问题,每个子问题与原问题具有完全相同的解决思路,进而可以按照递归的思路进行求解。
2. 解:通过分治算法的一般设计步骤进行说明。
3. 解:int fibonacci(int n) {if(n<=1) return 1;return fibonacci(n-1)+fibonacci(n-2); }4. 解:void hanoi(int n,int a,int b,int c) {if(n>0) {hanoi(n-1,a,c,b); move(a,b);hanoi(n-1,c,b,a); } } 5. 解:①22*2)(--=n n f n② )log *()(n n n f O =6. 解:算法略。
算法设计与分析第三版第四章课后习题答案
算法设计与分析第三版第四章课后习题答案4.1 线性时间选择问题习题4.1问题描述:给定一个长度为n的无序数组A和一个整数k,设计一个算法,找出数组A中第k小的元素。
算法思路:本题可以使用快速选择算法来解决。
快速选择算法是基于快速排序算法的思想,通过递归地划分数组来找到第k小的元素。
具体步骤如下: 1. 选择数组A的一个随机元素x作为枢纽元。
2. 使用x将数组划分为两个子数组A1和A2,其中A1中的元素小于等于x,A2中的元素大于x。
3. 如果k等于A1的长度,那么x就是第k小的元素,返回x。
4. 如果k小于A1的长度,那么第k小的元素在A1中,递归地在A1中寻找第k小的元素。
5. 如果k大于A1的长度,那么第k小的元素在A2中,递归地在A2中寻找第k-A1的长度小的元素。
6. 递归地重复上述步骤,直到找到第k小的元素。
算法实现:public class LinearTimeSelection {public static int select(int[] A, int k) { return selectHelper(A, 0, A.length - 1, k);}private static int selectHelper(int[] A, int left, int right, int k) {if (left == right) {return A[left];}int pivotIndex = partition(A, left, righ t);int length = pivotIndex - left + 1;if (k == length) {return A[pivotIndex];} else if (k < length) {return selectHelper(A, left, pivotInd ex - 1, k);} else {return selectHelper(A, pivotIndex + 1, right, k - length);}}private static int partition(int[] A, int lef t, int right) {int pivotIndex = left + (right - left) / 2;int pivotValue = A[pivotIndex];int i = left;int j = right;while (i <= j) {while (A[i] < pivotValue) {i++;}while (A[j] > pivotValue) {j--;}if (i <= j) {swap(A, i, j);i++;j--;}}return i - 1;}private static void swap(int[] A, int i, int j) {int temp = A[i];A[i] = A[j];A[j] = temp;}}算法分析:快速选择算法的平均复杂度为O(n),最坏情况下的复杂度为O(n^2)。
《算法设计与分析》课件
常见的贪心算法包括最小生成树算法 、Prim算法、Dijkstra算法和拓扑排 序等。
贪心算法的时间复杂度和空间复杂度 通常都比较优秀,但在某些情况下可 能需要额外的空间来保存状态。
动态规划
常见的动态规划算法包括斐波那契数列、背包 问题、最长公共子序列和矩阵链乘法等。
动态规划的时间复杂度和空间复杂度通常较高,但通 过优化状态转移方程和状态空间可以显著提高效率。
动态规划算法的时间和空间复杂度分析
动态规划算法的时间复杂度通常为O(n^2),空间复杂度为O(n)。
04 经典问题与算法实现
排序问题
冒泡排序
通过重复地遍历待排序序列,比较相邻元素的大小,交换 位置,使得较大的元素逐渐往后移动,最终达到排序的目 的。
快速排序
采用分治策略,选取一个基准元素,将比基准元素小的元 素移到其左边,比基准元素大的元素移到其右边,然后对 左右两边的子序列递归进行此操作。
动态规划是一种通过将原问题分解为若干个子 问题,并从子问题的最优解推导出原问题的最 优解的算法设计方法。
动态规划的关键在于状态转移方程的建立和状态 空间的优化,以减少不必要的重复计算。
回溯算法
01
回溯算法是一种通过穷举所有可能情况来求解问题的算法设计方法。
02
常见的回溯算法包括排列组合、八皇后问题和图的着色问题等。
空间换时间 分治策略 贪心算法 动态规划
通过增加存储空间来减少计算时间,例如使用哈希表解决查找 问题。
将问题分解为若干个子问题,递归地解决子问题,最终合并子 问题的解以得到原问题的解。
在每一步选择中都采取当前状态下最好或最优(即最有利)的 选择,从而希望导致结果是最好或最优的。
通过将问题分解为相互重叠的子问题,并保存子问题的解,避 免重复计算,提高算法效率。
《算法设计与分析》(全)
1.1、算法与程序
程序:是算法用某种程序设计语言的具体实现。 程序可以不满足算法的性质(4)。 例如操作系统,是一个在无限循环中执行的程序, 因而不是一个算法。 操作系统的各种任务可看成是单独的问题,每一个 问题由操作系统中的一个子程序通过特定的算法来实 现。该子程序得到输出结果后便终止。
渐近分析记号的若干性质
(1)传递性: ➢ f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n)); ➢ f(n)= O(g(n)), g(n)= O (h(n)) f(n)= O (h(n)); ➢ f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n)); ➢ f(n)= o(g(n)), g(n)= o(h(n)) f(n)= o(h(n)); ➢ f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n)); (2)反身性: ➢ f(n)= (f(n));f(n)= O(f(n));f(n)= (f(n)). (3)对称性: ➢ f(n)= (g(n)) g(n)= (f(n)) . (4)互对称性: ➢ f(n)= O(g(n)) g(n)= (f(n)) ; ➢ f(n)= o(g(n)) g(n)= (f(n)) ;
巢湖学院计算机科学与技术系
渐近分析记号的若干性质
规则O(f(n))+O(g(n)) = O(max{f(n),g(n)}) 的证明: ➢ 对于任意f1(n) O(f(n)) ,存在正常数c1和自然数n1,使得对
所有n n1,有f1(n) c1f(n) 。 ➢ 类似地,对于任意g1(n) O(g(n)) ,存在正常数c2和自然数
巢湖学院计算机科学与技术系
第1章 算法引论
算法设计与分析(第2版)
出版工作
2018年8月1日,该教材由清华大学出版社出版。
内容简介
内容简介
全书由12章构成,各章的内容如下。
第1章概论:介绍算法的概念、算法分析方法和STL在算法设计中的应用。
教材目录
教材目录
(注:目录排版顺序为从左列至右列 )
教学资源
教学资源
该教材配有配套教材——《算法设计与分析(第2版)学习与实验指导》,该配套教材涵盖所有练习题、上 机实验题和在线编程题的参考答案。
该教材每个知识点都配套了视频讲解,提供PPT课件、源码、答案、教学大纲、题库、书中全部源程序代码 (在VC++6.0中调试通过)等教学资源。
算法设计与分析(第2版)
20xx年清华大学出版社出版的图书
01 成书过程
03 教材目录源 06 作者简介
基本信息
《算法设计与分析(第2版)》是由李春葆主编,2018年清华大学出版社出版的高等学校数据结构课程系列 教材。该教材适合作为高等院校“算法设计与分析”课程的教材,也可供ACM和各类程序设计竞赛者参考。
第5章回溯法:介绍解空间概念和回溯法算法框架,讨论采用回溯法求解0/1背包问题、装载问题、子集和问 题、n皇后问题、图的m着色问题、任务分配问题、活动安排问题和流水作业调度问题的典型算法。
第6章分枝限界法:介绍分枝限界法的特点和算法框架、队列式分枝限界法和优先队列式分枝限界法,讨论 采用分枝限界法求解0/1背包问题、图的单源最短路径、任务分配问题和流水作业调度问题的典型算法。
该教材介绍了各种常用的算法设计策略,包括递归、分治法、蛮力法、回溯法、分枝限界法、贪心法、动态 规划、概率算法和近似算法等,并讨论了各种图算法和计算几何设计算法。书中配有图表、练习题、上机实验题 和在线编程题。
算法设计与分析(第4版)
内容简介
《算法设计与分析(第4版)》以算法设计策略为知识单元,系统地介绍计算机算法的设计方法与分析技巧, 以期为计算机科学与技术学科的学生提供广泛而坚实的计算机算法基础知识。
第1章中首先介绍算法的基本概念,接着简要阐述算法的计算复杂性和算法的描述,然后围绕设计算法常用的 基本设计策略组织第2章至第10章的内容。第2章介绍递归与分治策略,这是设计有效算法常用的策略,是必须掌 握的方法。第3章是动态规划算法,以实例详述动态规划算法的设计思想、适用性以及算法的设计要点。第4章介 绍贪心算法,它与动态规划算法的设计思想有一定的。第5章和第6章分别介绍回溯法和分支限界法,这两章所介 绍的算法适合处理难解问题。第7章介绍概率算法,对许多难解问题提供解决途径。第8章介绍NP完全性理论和解 NP难问题的近似算法。第9章介绍有关串和序列的算法。第10章通过实例介绍算法设计中常用的算法优化策略。 第11章介绍算法设计中较新的研究领域——在线算法设计。
《算法设计与分析(第4版)》按照教育部制定的“计算机科学与技术专业规范的教学大纲”编写,在前三版 的基础下作了相应修改,按照国际计算机学科的教学要求进行整编。
《算法设计与分析(第4版)》是在21世纪大学本科计算机专业系列教材编委会的指导下完成出版。 2018年10月1日,《算法设计与分析(第4版)》由清华大学出版社出版。
全书共分11章,由算法引论、递归与分治策略、动态规划、章贪心算法、回溯法、分支限界法、概率算法、 NP完全性理论与近似算法、串与序列的算法、算法优化策略、在线算法设计组成。
成培养中国21世纪计算机各类人才的需要,结合中国高等学校教育工作的现状,立足培养学生能跟上 国际计算机科学技术的发展水平,更新教学内容和教学方法,提高教学质量,作者编写了该书。
算法分析与设计(习题答案)
算法分析与设计教程习题解答第1章 算法引论1. 解:算法是一组有穷的规则,它规定了解决某一特定类型问题的一系列计算方法。
频率计数是指计算机执行程序中的某一条语句的执行次数。
多项式时间算法是指可用多项式函数对某算法进行计算时间限界的算法。
指数时间算法是指某算法的计算时间只能使用指数函数限界的算法。
2. 解:算法分析的目的是使算法设计者知道为完成一项任务所设计的算法的优劣,进而促使人们想方设法地设计出一些效率更高效的算法,以便达到少花钱、多办事、办好事的经济效果。
3. 解:事前分析是指求出某个算法的一个时间限界函数(它是一些有关参数的函数);事后测试指收集计算机对于某个算法的执行时间和占用空间的统计资料。
4. 解:评价一个算法应从事前分析和事后测试这两个阶段进行,事前分析主要应从时间复杂度和空间复杂度这两个维度进行分析;事后测试主要应对所评价的算法作时空性能分布图。
5. 解:①n=11; ②n=12; ③n=982; ④n=39。
第2章 递归算法与分治算法1. 解:递归算法是将归纳法的思想应用于算法设计之中,递归算法充分地利用了计算机系统内部机能,自动实现调用过程中对于相关且必要的信息的保存与恢复;分治算法是把一个问题划分为一个或多个子问题,每个子问题与原问题具有完全相同的解决思路,进而可以按照递归的思路进行求解。
2. 解:通过分治算法的一般设计步骤进行说明。
3. 解:int fibonacci(int n) {if(n<=1) return 1;return fibonacci(n-1)+fibonacci(n-2); }4. 解:void hanoi(int n,int a,int b,int c) {if(n>0) {hanoi(n-1,a,c,b); move(a,b);hanoi(n-1,c,b,a); } } 5. 解:①22*2)(−−=n n f n② )log *()(n n n f O =6. 解:算法略。
算法设计与分析耿国华第四章
Chapter
4
4.1.5 贪心算法的例子 ——算法分析
1)贪心选择性质
证明:设背包按其单位价值量pi/wi由高到低排序,(x1,x2,…,xn) 是背包问题的一个最优解。又设 k m in i x 0 易知,如果给定问题有解,则 1 k n 。 当k=1, (x1,x2,…,xn)是以贪心算法开始的最优解。 当k>1, 设有一个集合(y1,y2,…,yn),其中y1=pk/p1*xk, yk=0, yi=xi ,2 i n . 则 w y w x w x w * p / p *x
Chapter
4
4.2 汽车加油问题
本节内容 1.问题分析 2.算法分析 3.设计与实现
Chapter
4
4.2 汽车加油问题
• 问题描述
一辆汽车加满油后可以行驶N千米。旅途中有若干个加 油站,如图4-1所示。指出若要使沿途的加油次数最少,设 计一个有效的算法,指出应在那些加油站停靠加油(前提: 行驶前车里加满油)。
Chapter
4
4.2 汽车加油问题 ——算法分析
2)最优子结构性质
•
当一个大问题的最优解包含着它的子问题的最优解时,称 该问题具有最优子结构性质。 (b[1],b[2],……b[n]) 整体最优解 b[1]=1,(b[2],b[3],……b[n]) 局部最优解 每一次加油后与起点具有相同的条件,每个过程都是相 同且独立。
•
Chapter
4
4.1.5 贪心算法的例子
•
(3)选利润/重量为量度,使每一次装入的物品应使它占用的每一 单位容量获得当前最大的单位效益。 按物品的pi/wi重量从大到小排序:1,2,0; 解为: (x0,x1,x2)=(0, 1, 1/2) 收益: 24+15/2=31.5 此方法解为最优解。可见,可以把pi/wi 作为背包问题 的最优量度标准。
《算法设计与分析》课件
本课程将介绍算法的设计与分析,包括排序算法、查找算法和动态规划算法。 通过掌握这些算法,您将能够解决各种复杂的问题。
课程介绍
课程目标和内容概述
掌握算法设计与分析的基本概念和方法,学 习不同类型的算法及其应用。
教学方法和要求
通过理论讲解、案例分析和实际编程练习, 提高算法设计与分析的能力。
2 背包问题的动态规划解法
学习如何使用动态规划算法解决背包问题,掌握求解最优解的方法。
总结和课程评价
总结
回顾本课程涉及的算法内容,并思考所学知识 的实际应用。
课程评价
对本课程的内容、教学方法和教师的表现进行 评价和反馈。
算法基础
1 算法概述和分类
了解算法的定义、特性和常见的分类方法,为后续学习打下基础。
2 时间复杂度和空间复杂度
学习如何评估算法的时间和空间效率,并选择最合适的算法。
排序算法
1
插入排序
2
学习插排序算法的思想和实现过程,
掌握其时间复杂度和适用范围。
3
冒泡排序
掌握冒泡排序算法的原理和实现方法, 了解其时间复杂度和应用场景。
快速排序
了解快速排序算法的原理和分治思想, 学会如何选择合适的划分策略。
查找算法
顺序查找
掌握顺序查找算法的基本思想和实现过程,了 解其时间复杂度和使用场景。
二分查找
学习二分查找算法的原理和应用,了解其时间 复杂度和适用条件。
动态规划算法
1 原理和应用举例
了解动态规划算法的核心原理,并通过实例了解其在解决复杂问题时的应用。
算法分析与设计算法设计与分析一课件
本课程需要的基础 数据结构 程序设计语言(C/C++):结构化设计 一定的数学基础 操作系统、编译
授课形式: 课堂教学:(√) 课堂讨论:专题、解题报告 上机实践:需要提交实验报告
主要参考书
计算机算法基础, 余祥宣等编著,华中科技大学出版社 Introduction to algorithms, Thomas H. Cormen,etc., third
数值天气预报
只有在要求的时间内解决问题才是有意义的。
基于算法的时效性,只有把在相当有穷步内终止的 算法投入到计算机上运行才是实际可行的。
何为“相当有穷”? ——通过算法分析,了解算法速度,给出算法计算 时间的一个精确的描述,以衡量算法的执行速度, 选择合适的算法解决问题。 注:算法分析还包括空间分析。
运算的分类(续)
➢ 时间非囿界于常数的运算:
字符串操作:与字符串中字符的数量成正比 例:字符串的比较运算(strcmp)
与算法学习相关的内容
五个方面:设计、表示、证明、分析、测试
1)设计:构思算法的处理规则,创造性的活动。
2)表示:用语言把算法描述出来。“类语言”、“伪代码” (SPARKS语言、类C语言)
3)证明:证明算法是正确的。 算法的正确性:对合法输入能得出正确的答案。 算法的证明:证明算法的正确性,与语言无关 程序的证明:证明程序的正确性
4)分析:对算法的时、空特性做定性、定量分析,以了解算法 的性质。
5)测试:将算法变成程序,放到计算机上运行,观察运行情况 编程中的调试:排错过程。“调试只能指出有错误,而不 能指出它们不存在错误” 运行中的测试:分析过程。作时空分布图,验证分析结论, 进一步优化算法设计。
本课程集中于学习算法的设计与分析。通过学习,掌握计算 机算法设计和分析基本策略与方法,为设计更复杂、 更有效的算法奠定基础
算法设计与分析课件
2019/6/10
35
2.3递归技术
以上的关系实际上给出了计算Q(n,m)的 递归式如下递归技术
可以设计出计算Q(n,m)的递归算法如下:
int Q(int n, int m)
{
if((n < 1) || (m < 1))
return 0;
if((n == 1) || (m == 1))
2019/6/10
8
1.2计算复杂性的测度
问题的规模:也就是该问题所谓的体积,或者说是大 小。一个问题的体积可以用一个整数来表示,它是对 问题的输入数据或初始数据的多少的一种量度。
定义:如果一个问题的体积是n,解决这一问题的某一 算法所需要的时间为T(n),它是n的某一函数,T(n)称 作这一算法的“时间复杂性”。当输入量n逐渐增大时, T(n)的极限情形就称作算法的“渐近时间复杂性”, 类似可定义算法的空间复杂性。但实际上人们主要是 研究算法的时间复杂性而很少讨论它们的空间耗费。
2019/6/10
29
2.3递归技术
Acheman函数A(n,m)有两个独立的整变 量m≥0 和 n≥0,其定义如下:
2019/6/10
30
2.3递归技术
A(n,m)的自变量m的每一个值都定义了一个单 变量函数。由递归式的第三式可知m = 0定义 了函数“加2”。
当m = 1时,由于A(1,1) = A(A(0,1),0) = A(1,0) = 2以及A(n,1) = A(A(n-1,1),0) = A(n1,1) + 2 (n > 1),则A(n,1) = 2n (n ≥ 1),即 A(n,1)是函数“乘2”
2019/6/10
14
《算法设计与分析》课件第4章
子问题空间就是从Sij中选择最大相互相容活动子集,0≤i,j ≤n+1,其他的Sij为空。为了搞清楚活动选择问题的子结构, 考虑某些非空子集Sij(有时称做子集,有时称做子问题,读 者可从上下文看出)。假定Sij的一个解包括活动ak,则有 fi≤sk<fk≤sj。活动ak产生两个子问题Sik和Skj。Sik表示活动ai完 成之后,活动ak开始之前的那些活动集。Skj表示活动ak
的相容活动集合。假定集合S={a1, a2,…, an}中含有n个希望 使用某一资源的活动,这样的资源有教室、某一设备等,它
们一次只能由一个活动使用。每个活动ai有开始时间(start time)si和完成时间(finish time)fi,其中,0≤si<fi<∞。如果某 个活动ai被选中使用资源,则该活动在半开区间(si,fi]这 段时间占据资源。如果活动ai和aj在时间区间(si,fi]和(sj, fj]上不重叠,则称它们是相容的(compatible),即如果si≥fj 或者sj≥fi,活动ai和aj是相容的。活动选择问题是选择最大的 相容活动集合。
i 1
述假设,可以推得yk<xk。以下首先证明这一点,分三种情
况讨论:
(1) 若k<j,则xk=1。又yk≠xk,从而yk<xk。
(2) 若k=j,对于1≤i<nj,有xi=yi=1;而对于nj<i≤n,有xi=0。
若yk>xk,显然有
wi y,i 因W为
wi y与i y是W可
行解矛盾。若yk=xk,与假i1设yk≠xk矛盾,因此,i1yk<xk。
所选活动的完成时间随着时间严格递增。我们只需按照完成
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
24
4.3 最优装载
有一批集装箱要装上一艘载重量为c的轮船。其中 集装箱i的重量为Wi。最优装载问题要求确定在装载体 积不受限制的情况下,将尽可能多的集装箱装上轮船。
1、算法描述
最优装载问题可用贪心算法求解。 采用重量最轻者先装的贪心选择策略,可产生最优
法与动态规划算法的主要差别。
19
4.2 贪心算法的基本要素
0-1背包问题:
给定n种物品和一个背包。物品i的重量是Wi,其价值为 Vi,背包的容量为C。应如何选择装入背包的物品,使 得装入背包中物品的总价值最大?
在选择装入背包的物品时,对每种物品i只有2种选 择,即装入背包或不装入背包。不能将物品i装入背包 多次,也不能只装入部分的物品i。
第4章 贪心算法
1
学习要点
1. 理解贪心算法的概念。 2. 掌握贪心算法的基本要素 • (1)最优子结构性质 • (2)贪心选择性质 3. 理解贪心算法与动态规划算法的差异 4. 理解贪心算法的一般理论 5. 通过应用范例学习贪心设计策略。 • (1)活动安排问题; • (2)最优装载问题; • (3)哈夫曼编码; • (4)单源最短路径; • (5)最小生成树; • (6)多机调度问题。
9
4.1 活动安排问题
• 图中每行相应于算法的一 次迭代。
• 阴影长条表示的活动是已 选入集合A的活动
• 空白长条表示的活动是当 前正在检查相容性的活动。
算法greedySelector 的计算过程
10
4.1 活动安排问题
✓ 若被检查的活动i的开始时间Si小于最近选择的活动j的 结束时间fi,则不选择活动i,否则选择活动i加入集合A 中。
✓ 贪心算法并不总能求得问题的整体最优解。 ✓ 但对于活动安排问题,贪心算法greedySelector却总
能求得的整体最优解,即它最终所确定的相容活动集 合A的规模最大。 ✓ 这个结论可以用数学归纳法证明。
11
4.1活动安排问题
命题: 对于活动安排问题,贪心算法总能求得整体最优 解,即它所确定的相容活动集合A的规模最大。
} 23
4.2 贪心算法的基本要素
➢ 对于0-1背包问题,贪心选择之所以不能得到最优解是因 为在这种情况下,它无法保证最终能将背包装满,部分闲 置的背包空间使每公斤背包空间的价值降低了。
➢ 事实上,在考虑0-1背包问题时,应比较选择该物品和不 选择该物品所导致的最终方案,然后再作出最好选择。由 此就导出许多互相重叠的子问题。这正是该问题可用动态 规划算法求解的另一重要特征。
动选自集合E’={ i| i∈ E, si ≥ fk},且A = { i1, i2, … , ik } ∪ B , B是E’的最优解.(若不然, E’的最优解为B*, B*的活动比B多,那
么B* ∪{1, i2, … , ik}是E 的最优解,且比A的活动多,与A 的最优性矛盾最.优)子结 构性质
由归纳基础,存在E’的最优解B’含有E’中的第一个活动, 设为ik+1, 且| B’ |=|B|, 于是
22
4.2 贪心算法的基本要素
void Knapsack(int n,float M,float v[],float w[],float x[])
{
Sort(n,v,w); int i; for (i=1;i<=n;i++) x[i]=0; float c=M; for (i=1;i<=n;i++) {
➢ 直观上,按这种方法选择相容活动为未安排活动 留下尽可能多的时间。也就是说,该算法的贪心 选择的意义是使剩余的可安排时间段极大化,以 便安排尽可能多的相容活动。
➢ 算法greedySelector的效率极高。当输入的活动 已按结束时间的非减序排列,算法只需O(n)的时 间安排n个活动,使最多的活动能相容地使用公共 资源。
对于一个具体问题,要确定它是否具有贪心选择性质, 必须证明每一步所作的贪心选择最终导致问题的整体 最优解。
17
4.2 贪心算法的基本要素
2、最优子结构性质
当一个问题的最优解包含其子问题的最优解时, 称此问题具有最优子结构性质。
问题的最优子结构性质是该问题可用动态规划算 法或贪心算法求解的关键特征。
2
➢ 顾名思义,贪心算法总是作出在当前看来最好的选择。 ➢ 也就是说贪心算法并不从整体最优考虑,它所作出的选择
只是在某种意义上的局部最优选择。 ➢ 当然,希望贪心算法得到的最终结果也是整体最优的。虽
然贪心算法不能对所有问题都得到整体最优解,但对许多 问题它能产生整体最优解。如单源最短路径问题,最小生 成树问题等。 ➢ 在一些情况下,即使贪心算法不能得到整体最优解,其最 终结果却是最优解的很好近似。
每个活动i都有一个要求使用该资源的起始时间si和一个 结束时间fi,且si<fi 。
如果选择了活动i,则它在半开时间区间[si, fi)内占用资 源。
若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是 相容的。也就是说,当si≥fj或sj≥fi时,活动i与活动j相 容。
5
for (int i = 1; i <= n && w[t[i]] <= c; i++) {x[t[i]] = 1; c -= w[t[i]];}
}
t[i]存储排序后在第i个位置的集装箱在排序前是第几个,1≤i ≤n
26
4.3 最优装载
2、贪心选择性质
可以证明最优装载问题具有贪心选择性质。 设集装箱已按重量从小到大排序,(x1,x2,…,xn)是最优装载问题的 一个最优解。设k是其中第一个集装箱的编号。若k=1,则该最优解 是满足贪心选择性质的最优解; 若k>1,则取y1=1,yk=0, yi=xi (i≠k),则(y1,y2,…yn)是一个可行解。且由于该解可装载集装箱个数与 (x1,x2,…,xn)可装载集装箱个数相同,故也是一个最优解。
装载问题的最优解。
25
4.3 最优装载
template<class Type>
void Loading(int x[], Type w[], Type c, int n)
{
int *t = new int [n+1];
Sort(w, t, n);
for (int i = 1; i <= n; i++) x[i] = 0;
if (s[i]>=f[j]) { A[i]=true; j=i; }
各活动的起始时间和结 束时间存储于数组s和f 中且按结束时间的非减
序排列
else A[i]=false;
}
}
7
4.1 活动安排问题
➢ 由于输入的活动以其完成时间的非减序排列,所 以算法greedySelector每次总是选择具有最早完 成时间的相容活动加入集合A中。
➢ 基于上述两点,对贪心选择次数用数学归纳法即知, 通过每一步做贪心选择,最终可得到问题的整体最优 解。
13
正确性证明1-归纳证明
归纳基础:证明存在最优解包含活动1
(贪心选择性质)
归纳步骤:假设按照算法前k 步选择都导致最优解,证明 第k+1选择也导致最优解
假设算法执行到第k 步, 选择了活动i1=1, i2, …, ik, 根据归 纳假设,存在最优解A 包含i1=1, i2, …, ik, A中剩下的活
也是原问题最优解,即贪心选择第k+1步选择也导致最优解. 14
正确性证明2-交换论证
交换论证:在保证最优性不变的前提下,从一个最优 解进行逐步替换,最终得到贪心法的解 令 i1, i2, ... ik 为贪心算法所选择的活动子集 令j1, j2, ... jm 表示一个最优解 令r为使得i1 = j1, i2 = j2, ..., ir = jr 的最大值
证明:设E为活动集合,其中活动按结束时间非减序配 列,故活动1具有最早完成时间。
➢ 首先证明活动安排问题具有贪心选择性质,即有一个
最优解以贪心选择开始(即包含活动1):设A⊆E是一
个最优解,且A中活动按结束时间非减序排列,A中第 一个活动是k. 若k=1,则A满足;若k>1,则设B=A-
{k}∪{1}. 由于f1≤ fk, 且A中活动是相容的,故B中活动
用贪心算法解背包问题的基本步骤:
1.计算每种物品单位重量的价值Vi/Wi; 2.依贪心选择策略,将尽可能多的单位重量价值最高的物品
装入背包; 3.若将这种物品全部装入背包后,背包内的物品总重量未超
过C,则选择单位重量价值次高的物品并尽可能多地装入 背包; 4.依此策略一直地进行下去,直到背包装满为止。
也相容,且也是最优的。因此,总存在以贪心选择开 始的最优活动方案。
12
4.1 活动安排问题
➢ 进一步证明具有最优子结构性质,即在做出贪心选择 之后,原问题简化为同类型的子问题:若A是原问题的 最优解,则A’=A-{1}是活动安排问题E’={i|f1 ≤ si}的最 优解。事实上,如果能找到E’的一个解B’,它包含比 A’更多的活动,则将活动1加入B’中将产生E的一个解B ,它包含比A更多的活动,这与A的最优性矛盾。
➢ 如果所给出的活动未按非减序排列,可以用 O(nlogn)的时间重排。
8
4.1 活动安排问题
例:设待安排的11个活动的开始时间和结束时间按结 束时间的非减序排列如下:
i 1 2 3 4 5 6 7 8 9 10 11 S[i] 1 3 0 5 3 5 6 8 8 2 12 f[i] 4 5 6 7 8 9 10 11 12 13 14
算法knapsack的主 要计算时间在于将各 种物品依其单位重量 的价值从大到小排序。 因此,算法的计算时 间上界为O(nlogn);