计算机算法设计和分析第版王晓东编著电子教案省公共课一等奖全国赛课获奖课件.pptx
《计算机算法设计和分析第版王晓东编著电子教案省公共课一等奖全国赛课获奖课件.pptx》由会员分享,可在线阅读,更多相关《计算机算法设计和分析第版王晓东编著电子教案省公共课一等奖全国赛课获奖课件.pptx(59页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第4章 贪心算法1第1页学习关键点学习关键点了解贪心算法概念。掌握贪心算法基本要素(1)最优子结构性质(2)贪心选择性质了解贪心算法与动态规划算法差异了解贪心算法普通理论经过应用范例学习贪心设计策略。(1)活动安排问题;(2)最优装载问题;(3)哈夫曼编码;(4)单源最短路径;(5)最小生成树;(6)多机调度问题。2第2页 顾名思义,贪心算法总是作出在当前看来最好选择。也就是说贪心算法并不从整体最优考虑,它所作出选择只是在某种意义上局部最优局部最优选择。当然,希望贪心算法得到最终止果也是整体最优。即使贪心算法不能对全部问题都得到整体最优解,但对许多问题它能产生整体最优解。如单源最短路经问题,最
2、小生成树问题等。在一些情况下,即使贪心算法不能得到整体最优解,其最终止果却是最优解很好近似。3第3页4.1 活动安排问题 活动安排问题就是要在所给活动集合中选出最大相容活动子集合,是能够用贪心算法有效求解很好例子。该问题要求高效地安排一系列争用某一公共资源活动。贪心算法提供了一个简单、漂亮方法使得尽可能多活动能兼容地使用公共资源。4第4页4.1 活动安排问题 设有n个活动集合E=1,2,n,其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源起始时间si和一个结束时间fi,且si fi。假如选择了活动i,则它在半开时间区间si
3、,fi)内占用资源。若区间si,fi)与区间sj,fj)不相交,则称活动i与活动j是相容。也就是说,当sifj或sjfi时,活动i与活动j相容。5第5页4.1 活动安排问题ntemplatenvoid GreedySelector(int n,Type s,Type f,bool A)nn A1=true;n int j=1;n for(int i=2;i=fj)Ai=true;j=i;n else Ai=false;n n下面给出解活动安排问题贪心算法GreedySelectorGreedySelector:各活动起始时间和结束各活动起始时间和结束时间存放于数组时间存放于数组s s和和f f
4、中中且按结束时间非减序排且按结束时间非减序排列列 6第6页4.1 活动安排问题 因为输入活动以其完成时间非减序非减序排列,所以算法greedySelectorgreedySelector每次总是选择含有最早完成含有最早完成时间时间相容活动加入集合A中。直观上,按这种方法选择相容活动为未安排活动留下尽可能多时间。也就是说,该算法贪心选择意义是使剩下可安排使剩下可安排时间段极大化时间段极大化,方便安排尽可能多相容活动。算法greedySelectorgreedySelector效率极高。当输入活动已按结束时间非减序排列,算法只需O(n)O(n)时间安排n个活动,使最多活动能相容地使用公共资源。假如
5、所给出活动未按非减序排列,能够用O(nlogn)O(nlogn)时间重排。7第7页4.1 活动安排问题 例:例:设待安排11个活动开始时间和结束时间按结束时间非减序排列以下:i1234567891011Si130535688212fi45678910 11 12 13 148第8页4.1 活动安排问题 算法算法greedySelector greedySelector 计算过程计算过程如左图所表示。图中每行对应于算法一次迭代。阴影长条表示活动是已选入集合A活动,而空白长条表示活动是当前正在检验相容性活动。9第9页4.1 活动安排问题 若被检验活动i开始时间Si小于最近选择活动j结束时间fi,则
6、不选择活动i,不然选择活动i加入集合A中。贪心算法并不总能求得问题整体最优解整体最优解。但对于活动安排问题,贪心算法greedySelector却总能求得整体最优解,即它最终所确定相容活动集合A规模最大。这个结论能够用数学归纳法证实。10第10页4.2 贪心算法基本要素 本节着重讨论能够用贪心算法求解问题普通特征。对于一个详细问题,怎么知道是否可用贪心算法解此问题,以及能否得到问题最优解呢?这个问题极难给予必定回答。不过,从许多能够用贪心算法求解问题中看到这类问题普通含有2个主要性质:贪心选择性质贪心选择性质和最优子最优子结构性质结构性质。11第11页4.2 贪心算法基本要素1 1、贪心选择性
7、质、贪心选择性质 所谓贪心选择性质贪心选择性质是指所求问题整体最优解整体最优解能够经过一系列局部最优局部最优选择,即贪心选择来到达。这是贪心算法可行第一个基本要素,也是贪心算法与动态规划算法主要区分。动态规划算法通常以自底向上自底向上方式解各子问题,而贪心算法则通常以自顶向下自顶向下方式进行,以迭代方式作出相继贪心选择,每作一次贪心选择就将所求问题简化为规模更小子问题。对于一个详细问题,要确定它是否含有贪心选择性质,必须证实每一步所作贪心选择最终造成问题整体最优解。12第12页4.2 贪心算法基本要素 当一个问题最优解包含其子问题最优解时,称此问题含有最优子结构性质最优子结构性质。问题最优子结
8、构性质是该问题可用动态规划算法或贪心算法求解关键特征。2 2、最优子结构性质、最优子结构性质13第13页4.2 贪心算法基本要素 贪心算法和动态规划算法都要求问题含有最优子结构性质,这是2类算法一个共同点。不过,对于含有最优子结构最优子结构问题应该选取贪心算法还是动态规划算法求解?是否能用动态规划算法求解问题也能用贪心算法求解?下面研究2个经典组合优化问题组合优化问题,并以此说明贪心算法与动态规划算法主要差异。3、贪心算法与动态规划算法差异14第14页4.2 贪心算法基本要素n0-10-1背包问题:背包问题:给定n种物品和一个背包。物品i重量是Wi,其价值为Vi,背包容量为C。应怎样选择装入背
9、包物品,使得装入背包中物品总价值最大?在选择装入背包物品时,对每种物品在选择装入背包物品时,对每种物品i i只有只有2 2种选择,即装种选择,即装入背包或不装入背包。不能将物品入背包或不装入背包。不能将物品i i装入背包屡次,也不能只装装入背包屡次,也不能只装入部分物品入部分物品i i。15第15页4.2 贪心算法基本要素n背包问题:背包问题:与0-1背包问题类似,所不一样是在选择物品i装入背包时,能够选择物品能够选择物品i i一部分一部分,而不一定要全部装入背包,1in。这2类问题都含有最优子结构最优子结构性质,极为相同,但背包问题能够用贪心算法求解,而0-1背包问题却不能用贪心算法求解。1
10、6第16页4.2 贪心算法基本要素 首先计算每种物品单位重量价值Vi/Wi,然后,依贪心选择策略,将尽可能多单位重量价值最高单位重量价值最高物品装入背包。若将这种物品全部装入背包后,背包内物品总重量未超出C,则选择单位重量价值次高物品并尽可能多地装入背包。依此策略一直地进行下去,直到背包装满为止。详细算法可描述以下页:用贪心算法解背包问题基本步骤:17第17页4.2 贪心算法基本要素nvoid Knapsack(int n,float M,float v,float w,float x)nn Sort(n,v,w);n int i;n for(i=1;i=n;i+)xi=0;n float c
11、=M;n for(i=1;ic)break;n xi=1;n c-=wi;n n if(i=n)xi=c/wi;n 算法算法knapsackknapsack主主要计算时间在于将各要计算时间在于将各种物品依其单位重量种物品依其单位重量价值从大到小排序。价值从大到小排序。所以,算法计算时间所以,算法计算时间上界为上界为O O(nlognnlogn)。)。为了证实算法正确性,为了证实算法正确性,还必须证实背包问题还必须证实背包问题含有贪心选择性质含有贪心选择性质。18第18页4.2 贪心算法基本要素 对于0-10-1背包问题背包问题,贪心选择之所以不能得到最优解是因为在这种情况下,它无法确保最终能将
12、背包装满,部分闲置背包空间使每千克背包空间价值降低了。实际上,在考虑0-1背包问题时,应比较选择该物品和不选择该物品所造成最终方案,然后再作出最好选择。由此就导出许多相互重合子问题。这正是该问题可用动态规划算法动态规划算法求解另一主要特征。实际上也是如此,动态规划算法确实能够有效地解0-1背包问题。19第19页4.3 最优装载 有一批集装箱要装上一艘载重量为c轮船。其中集装箱i重量为Wi。最优装载问题要求确定在装载体积不受限制情况下,将尽可能多集装箱装上轮船。1 1、算法描述、算法描述最优装载问题可用贪心算法求解。采取重量最轻者先装贪心选择策略,可产生最优装载问题最优解。详细算法描述以下页。2
13、0第20页4.3 最优装载ntemplatenvoid Loading(int x,Type w,Type c,int n)nn int*t=new int n+1;n Sort(w,t,n);n for(int i=1;i=n;i+)xi=0;n for(int i=1;i=n&wti=c;i+)xti=1;c-=wti;n21第21页4.3 最优装载2 2、贪心选择性质、贪心选择性质 能够证实最优装载问题含有贪心选择性质。3 3、最优子结构性质、最优子结构性质最优装载问题含有最优子结构性质。由最优装载问题贪心选择性质和最优子结构性质,轻易证实算法loadingloading正确性。算法lo
14、adingloading主要计算量在于将集装箱依其重量从小到大排序,故算法所需计算时间为 O(nlogn)O(nlogn)。22第22页4.4 哈夫曼编码哈夫曼编码哈夫曼编码是广泛地用于数据文件压缩十分有效编码方法。其压缩率通常在20%90%之间。哈夫曼编码算法用字符在文件中出现频率表来建立一个用0,1串表示各字符最优表示方式。给出现频率高字符较短编码,出现频率较低字符以较长编码,能够大大缩短总码长。1、前缀码对每一个字符要求一个0,1串作为其代码,并要求任一字符代码都不是其它字符代码前缀。这种编码称为前缀码前缀码。23第23页4.4 哈夫曼编码 编码前缀性质能够使译码方法非常简单。表示最优前
15、缀码最优前缀码二叉树总是一棵完全二叉树完全二叉树,即树中任一结点都有2个儿子结点。平均码长平均码长定义为:使平均码长到达最小前缀码编码方案称为给定编码字符集C最优前缀码最优前缀码。24第24页4.4 哈夫曼编码2 2、结构哈夫曼编码、结构哈夫曼编码哈夫曼提出结构最优前缀码贪心算法,由此产生编码方案称为哈夫曼编码哈夫曼编码。哈夫曼算法以自底向上方式结构表示最优前缀码二叉树T。算法以|C|个叶结点开始,执行|C|1次“合并”运算后产生最终所要求树T。25第25页4.4 哈夫曼编码 在书上给出算法huffmanTree中,编码字符集中每一字符c频率是f(c)。以以f f为键值优先队列为键值优先队列Q
16、 Q用在贪心选贪心选择择时有效地确定算法当前要合并2棵含有最小频率树。一旦2棵含有最小频率树合并后,产生一棵新树,其频率为合并2棵树频率之和,并将新树插入优先队列Q。经过n1次合并后,优先队列中只剩下一棵树,即所要求树T。算法huffmanTree用最小堆实现优先队列Q。初始化优先队列需要O(n)计算时间,因为最小堆removeMin和put运算均需O(logn)时间,n1次合并总共需要O(nlogn)计算时间。所以,关于n个字符哈夫曼算法计计算时间算时间为O(nlogn)。26第26页4.4 哈夫曼编码3 3、哈夫曼算法正确性、哈夫曼算法正确性要证实哈夫曼算法正确性,只要证实最优前缀码问题含
17、有贪心选择性质贪心选择性质和最优子结构性质最优子结构性质。(1)贪心选择性质(2)最优子结构性质27第27页4.5 单源最短路径给定带权有向图G=(V,E),其中每条边权是非负实数。另外,还给定V中一个顶点,称为源源。现在要计算从源到全部其它各顶点最短路长度最短路长度。这里路长度是指路上各边权之和。这个问题通常称为单源最短路径单源最短路径问题问题。1、算法基本思想Dijkstra算法是解单源最短路径问题贪心算法。28第28页4.5 单源最短路径其基本思想基本思想是,设置顶点集合S并不停地作贪心选贪心选择择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点最短路径长度已知。初始时,S中仅含有
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 算法 设计 分析 第版王晓东 编著 电子 教案 公共课 一等奖 全国 获奖 课件
限制150内