贪心算法-课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《贪心算法-课件.ppt》由用户(ziliao2023)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贪心 算法 课件
- 资源描述:
-
1、 将问题的求解过程看作是一系列选择将问题的求解过程看作是一系列选择,每次选择一个每次选择一个输入输入,每次选择都是当前状态下的最好选择每次选择都是当前状态下的最好选择(局部最优解局部最优解).).每作一次选择后每作一次选择后,所求问题会简化为一个规模更小的子所求问题会简化为一个规模更小的子问题问题.从而通过每一步的最优解逐步达到整体的最优解。从而通过每一步的最优解逐步达到整体的最优解。4.1 基本思想 算法优点算法优点求解速度快,时间复杂性有较低的阶.算法缺点算法缺点需证明是最优解.常见应用背包问题,最小生成树,最短路径,作业调度等等适用问题适用问题 具备具备贪心选择贪心选择和和最优子结构最优
2、子结构性质的最优化问题性质的最优化问题贪心选择贪心选择性质:性质:整体的最优解可通过一系列局部最优解达到,即整体的最优解可通过一系列局部最优解达到,即贪心选择到达。贪心选择到达。贪心算法通常以自顶向下的方式进行,以迭代的方式作出相贪心算法通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每做一次贪心选择就将所求解的问题化简为规模继的贪心选择,每做一次贪心选择就将所求解的问题化简为规模更小的问题更小的问题 对于一个具体问题,要确定它是否具有贪心选择的性质,我对于一个具体问题,要确定它是否具有贪心选择的性质,我们必须证明每一步所作的贪心选择最终导致问题的最优解。通常们必须证明每一步所作的贪
3、心选择最终导致问题的最优解。通常可以首先证明问题的一个整体最优解,是从可以首先证明问题的一个整体最优解,是从 贪心选择开始的,而贪心选择开始的,而且作了贪心选择后,原问题简化为一个规模更小的类似子问题。且作了贪心选择后,原问题简化为一个规模更小的类似子问题。然后,用数学归纳法证明,通过每一步作贪心选择,最终可得到然后,用数学归纳法证明,通过每一步作贪心选择,最终可得到问题的一个整体问题的一个整体 最优解。最优解。最优子结构性质最优子结构性质:当一个问题的最优解包含其子问题的最优解时当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。,称此问题具有最优子结构性质。A(1)A(2
4、)A(n-1)A(n)某一问题的n个输入B1(1)B1(2)B1(m)该问题的一种解(可行解)是A的一个子集满足一定的条件约束条件Bk(1)Bk(2)Bk(m)目标函数取极值最优解算法设计与分析算法设计与分析 贪心算法贪心算法4.2.活动安排问题算法设计与分析算法设计与分析 贪心算法贪心算法活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子。该问题要求高效地安排一系列争用某一公共资源的活动。贪心算法提供了一个简单、漂亮的方法使得尽可能多的活动能兼容地使用公共资源。问题陈述问题陈述 设有n个活动的集合E=1,2,n,其中每个活动都要求使用同一资源,如
5、演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si fi。如果选择了活动i,则它在半开时间区间si,fi)内占用资源。若区间si,fi)与区间sj,fj)不相交,则称活动i与活动j是相容的。也就是说,当sifj或sjfi时,活动i与活动j相容。1 2 3 4 5 6 7 8 9 10 11例例1 3 0 5 3 5 6 8 8 2 12 4 5 6 7 8 9 10 11 12 13 14isifi设待安排的设待安排的1111个活动起止时间按结束时间的非减序排列个活动起止时间按结束时间的非减序排列最大相容活动子集(1,
6、4,8,111,4,8,11),也可表示为等长n元数组:(1,0,0,1,0,0,0,1,0,0,1)算法思路算法思路将将n个活动按结束时间非减序排列个活动按结束时间非减序排列,依次考虑活动依次考虑活动i,若若i与已选择的活动相容与已选择的活动相容,则添加此活动到相容活动子集则添加此活动到相容活动子集.活动安排问题贪心算法templatevoid GreedySelector(int n,Type s,Type f,bool A)A 1 =true;int j=1;/从第二个活动开始检查是否与前一个相容 for(int i=2;i=fj)Ai=true;j=i;else A i=false;算
7、法设计与分析算法设计与分析 贪心算法贪心算法各活动的起始时间和结各活动的起始时间和结束时间存储于数组束时间存储于数组s s和和f f中且按结束时间的非减中且按结束时间的非减序排列序排列 算法算法greedySelector greedySelector 的计算过程的计算过程如左图所示。图中每行相应于算法的一次迭代。阴影长条表示的活动是已选入集合A的活动,而空白长条表示的活动是当前正在检查相容性的活动。由于输入的活动以其完成时间的非减序非减序排列,所以算法greedySelector每次总是选择具有最早完成时间具有最早完成时间的相容活动加入集合A中。直观上,按这种方法选择相容活动为未安排活动留下
8、尽可能多的时间。也就是说,该算法的贪心选择的意义是使剩余的可安排时间段极大化使剩余的可安排时间段极大化,以便安排尽可能多的相容活动。算法greedySelector的效率极高。当输入的活动已按结束时间的非减序排列,算法只需O(n)的时间安排n个活动,使最多的活动能相容地使用公共资源。如果所给出的活动未按非减序排列,可以用O(nlogn)的时间重排。T(n)=O(nlogn)(未排序时)算法分析 T(n)=O(n)(排序时)算法证明 算法达到最优解.问题描述问题描述 输入输入:(x1,x2,.xn),xi=0,货箱货箱i不装船不装船;xi=1,货箱货箱i装船装船 可行解可行解:满足约束条件满足约
9、束条件 c 的输入的输入 优化函数优化函数:最优解最优解:使优化函数达到最大值的一种输入使优化函数达到最大值的一种输入.iniixw1niix14.3 最优装载算法设计与分析算法设计与分析 贪心算法贪心算法算法思路算法思路 将装船过程划为多步选择,每步装一个货箱,每次从将装船过程划为多步选择,每步装一个货箱,每次从剩下的货箱中选择重量最轻的货箱剩下的货箱中选择重量最轻的货箱.如此下去直到所有货箱均装上如此下去直到所有货箱均装上船或船上不能再容纳其他任何一个货箱。船或船上不能再容纳其他任何一个货箱。例设n=8,w1,w8=100,200,50,90,150,50,20,80,c=400。所考察货
10、箱的次序为:7,3,6,8,4,1,5,2。货箱7,3,6,8,4,1的总重量为390个单位且已被装载,剩下的装载能力为10,小于任意货箱.所以得到解x1,.x8=1,0,1,1,0,1,1,11、最优装载的贪心算法算法设计与分析算法设计与分析 贪心算法贪心算法template 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+)xi=0;for(int i=1;i=n&wti 0,1 0,1 i i n n4-4 背包问题(Knapsack Prob
11、lem)cxwniii1niiixv1max 问题描述问题描述 设有设有n个物体和一个背包个物体和一个背包,物体物体i的重量为的重量为wi,价值价值为为vi,背包的容量为背包的容量为C.若将物体若将物体i的的xi部分部分(1 i n,0 xi 1)装装入背包入背包,则具有价值为则具有价值为vi xi.目标是找到一个方案目标是找到一个方案,使放入背使放入背包的物体总价值最高包的物体总价值最高.约约束束条条件件优化函优化函数数算法设计与分析算法设计与分析 贪心算法贪心算法背包问题实例背包问题实例 考虑下列情况的背包问题考虑下列情况的背包问题 n=3,M=20,(v1,v2,v3)=(25,24,1
12、5),(w1,w2,w3)=(18,15,10)其中的其中的4个可行解是:个可行解是:(x1,x2,x3)wi xivixi(1/2,1/3,1/4)16.524.25(1,2/15,0)2028.2(0,2/3,1)2031(0,1,1/2)2031.5算法设计与分析算法设计与分析 贪心算法贪心算法贪心方法的数据选择策略贪心方法的数据选择策略(1)1、用贪心策略求解背包问题时,首先要选出最优、用贪心策略求解背包问题时,首先要选出最优的度量标准的度量标准。可以。可以选取目标函数为量度标准选取目标函数为量度标准,每装入一,每装入一件物品就使背包获得最大可能的效益值增量。在这种量件物品就使背包获得
13、最大可能的效益值增量。在这种量度标准下的贪心方法就是度标准下的贪心方法就是按效益值的非增次序将物品一按效益值的非增次序将物品一件件放到背包中件件放到背包中。如上面的实例所示,可如上面的实例所示,可将物品按效益量非增次序排将物品按效益量非增次序排序:序:(v1,v2,v3)=(25,24,15)。先装入物品。先装入物品1重量为重量为18,即,即x1=1;然后再装物品;然后再装物品2,由于约束条为,由于约束条为wi xi M=20,所以物品所以物品2只能装入重量为只能装入重量为2的一小部分,即的一小部分,即x2=2/15。按上述的数据选择策略,按上述的数据选择策略,装入顺序是按照物品的效装入顺序是
14、按照物品的效益值从大到小的输入益值从大到小的输入,由刚才的方法可得这种情况下的,由刚才的方法可得这种情况下的总效益值为总效益值为v vixi=25+24*2/15=28.2,显然是一个次优,显然是一个次优解,原因是背包容量消耗过快。解,原因是背包容量消耗过快。算法设计与分析算法设计与分析 贪心算法贪心算法贪心方法的数据选择策略贪心方法的数据选择策略(2)2、若以容量作为量度、若以容量作为量度,可让背包容量尽可能慢地,可让背包容量尽可能慢地被消耗。这就要求被消耗。这就要求按物品重量的非降次序来把物品放入按物品重量的非降次序来把物品放入背包背包,即,即(w3,w2,w1)=(10,15,18)。先
15、装入物品先装入物品3,x3=1,p3x3=15,再装入重量为,再装入重量为10的的物品物品2,vixi=15+24*10/15=31。由刚才的方法可得这种情况下的总效益值为由刚才的方法可得这种情况下的总效益值为31,仍,仍是一个次优解,原因是容量在漫漫消耗的过程中,效益是一个次优解,原因是容量在漫漫消耗的过程中,效益值却没有迅速的增加。值却没有迅速的增加。算法设计与分析算法设计与分析 贪心算法贪心算法贪心方法的数据选择策略贪心方法的数据选择策略(3)3、采用在效益值的增长速率和容量的消耗速率之间取采用在效益值的增长速率和容量的消耗速率之间取得平衡的量度标准得平衡的量度标准。即每一次装入的物品应
16、使它占用的每一。即每一次装入的物品应使它占用的每一单位容量获得当前最大的单位效益。这就需单位容量获得当前最大的单位效益。这就需使物品的装入次使物品的装入次序按序按vi/wi比值的非增次序来考虑比值的非增次序来考虑。这种策略下的量度是已装入物品的累计效益值与所用这种策略下的量度是已装入物品的累计效益值与所用容量之比。容量之比。(v2/w2,v3/w3,v1/w1)=(24/15,15/10,25/18)先装入重量为先装入重量为15的物品的物品2,在装入重量为,在装入重量为5的物品的物品3,pixi=24+15*5/10=31.5。此结果为最优解。此结果为最优解。算法设计与分析算法设计与分析 贪心
17、算法贪心算法算法思路1).将各物体按单位价值由高到低排序.2).取价值最高者放入背包.3).计算背包剩余空间.4).在剩余物体中取价值最高者放入背包.若背包剩余容量=0或物体全部装入背包为止 例例 n=3,c=20(v1,v2,v3)=(25,24,15),(w1,w2,w3)=(18,15,10)niiixw1niiixv1x1,x2,x3 0,2/3,10,1,1/2.1,2/15,020202028.23131.5.算法设计与分析算法设计与分析 贪心算法贪心算法void Knapsack(int n,float M,float v,float w ,float x)Sort(n,v,w,
18、t);/按单位价值排序/int i;for(i=1;i=n;i+)xi=0;float c=M;/c为背包剩余空间/for(i=1;i c)break;xti=1;c-=wti;if(i 贪心算法贪心算法算法分析算法分析:排序为主要算法时间,所以 T(n)=O(nlogn)背包问题中的物体不能分拆背包问题中的物体不能分拆,只能整个装入称为只能整个装入称为0-10-1背背包问题包问题.算法证明算法证明:该算法能得到在最优解 用贪心算法能得到用贪心算法能得到0-10-1背包的最优解吗背包的最优解吗?首先计算每种物品单位重量的价值首先计算每种物品单位重量的价值V Vi i/W/Wi i,然后,依贪,
19、然后,依贪心选择策略,将尽可能多的单位重量价值最高的物品装心选择策略,将尽可能多的单位重量价值最高的物品装入背包。若将这种物品全部装入背包后,背包内的物品入背包。若将这种物品全部装入背包后,背包内的物品总重量未超过总重量未超过C C,则选择单位重量价值次高的物品并尽可,则选择单位重量价值次高的物品并尽可能多地装入背包。依此策略一直地进行下去,直到背包能多地装入背包。依此策略一直地进行下去,直到背包装满为止。装满为止。具体算法可描述如下页:具体算法可描述如下页:void Knapsack(int n,float M,float v,float w,float x)Sort(n,v,w);int
20、i;for(i=1;i=n;i+)xi=0;float c=M;for(i=1;ic)break;xi=1;c-=wi;if(i 贪心算法贪心算法思考题找零钱问题:一个小孩买了价值为找零钱问题:一个小孩买了价值为3333美分的糖,美分的糖,并将并将1 1美元的钱交给售货员。售货员希望用数目最少美元的钱交给售货员。售货员希望用数目最少的硬币找给小孩。假设提供了数目不限的面值为的硬币找给小孩。假设提供了数目不限的面值为2525美分、美分、1010美分、美分、5 5美分、及美分、及1 1美分的硬币。使用贪心美分的硬币。使用贪心算法求解最优结果。并证明找零钱问题的贪心算法算法求解最优结果。并证明找零钱
21、问题的贪心算法总能产生具有最少硬币数的零钱。总能产生具有最少硬币数的零钱。算法设计与分析算法设计与分析 贪心算法贪心算法问题问题:通讯过程中需将传输的信息转换为二进制码通讯过程中需将传输的信息转换为二进制码.由于由于英文英文字母使用频率不同字母使用频率不同,若频率高的字母对应短的编码若频率高的字母对应短的编码,频率低的频率低的字母对应长的编码字母对应长的编码,传输的数据总量就会降低传输的数据总量就会降低.要求找到一个要求找到一个编码方案编码方案,使传输的数据量最少使传输的数据量最少.见见P109-P109-表表4-14-1 算法设计与分析算法设计与分析 贪心算法贪心算法1、前缀码、前缀码 为能
22、正确译码为能正确译码,编码需采用编码需采用前缀码前缀码,对每一个字符规定一个对每一个字符规定一个0,1串作为其代码,并要求任一字符的串作为其代码,并要求任一字符的代码都不是其它字符代码的前缀。这种编码称为前缀码。代码都不是其它字符代码的前缀。这种编码称为前缀码。表示最优前缀码的二叉树总是一棵完全二叉树,即树中任一表示最优前缀码的二叉树总是一棵完全二叉树,即树中任一结点都有结点都有2个儿子结点。个儿子结点。平均码长定义为:平均码长定义为:使平均码长达到最小的前缀码编码方案称为给定编码字符集使平均码长达到最小的前缀码编码方案称为给定编码字符集C的最优前缀码。的最优前缀码。4.4 哈夫曼编码)()(
23、)(cdcfTBTCc算法思路:算法思路:1)以以n个字母为结点构成个字母为结点构成n棵仅含一个点的二叉树集合棵仅含一个点的二叉树集合,字母的频率字母的频率 即为结点的权即为结点的权2)每次从二叉树集合中找出两个权最小者合并为一棵二叉树每次从二叉树集合中找出两个权最小者合并为一棵二叉树:增加增加一个根结点将这两棵树作为左右子树一个根结点将这两棵树作为左右子树.新树的权为两棵子树的权之新树的权为两棵子树的权之和和.3)反复进行步骤反复进行步骤2)直到只剩一棵树为止直到只剩一棵树为止.2、构造哈夫曼编码、构造哈夫曼编码哈夫曼提出构造最优前缀码的贪心算法,由此产生的编码方案称为哈夫曼编码哈夫曼编码。
24、哈夫曼算法以自底向上的方式构造表示最优前缀码的二叉树T。算法以|C|个叶结点开始,执行|C|1次的“合并”运算后产生最终所要求的树T。算法设计与分析算法设计与分析 贪心算法贪心算法 哈夫曼编码哈夫曼编码 template BinaryTreeHuffmanTree(T f,int n)/根据权f1:n构造霍夫曼树 /创建一个单节点树的数组 Huffman*W=newHuffman n+1;BinaryTree z,zero;for(int i=1;i=n;i+)z.MakeTree(i,zero,zero);Wi.weight=fi;Wi.tree=z:/数组变成个最小堆 MinHeapHuf
25、fmanQ(1);Q.Initialize(w,n,n);/将堆中的树不断合并 Huffman x,y for(i=1;i 贪心算法贪心算法 哈夫曼编码哈夫曼编码 在书上给出的算法huffmanTree中,编码字符集中每一字符c的频率是f(c)。以以f f为键值的优先队列为键值的优先队列Q Q用在贪心选择贪心选择时有效地确定算法当前要合并的2棵具有最小频率的树。一旦2棵具有最小频率的树合并后,产生一棵新的树,其频率为合并的2棵树的频率之和,并将新树插入优先队列Q。经过n1次的合并后,优先队列中只剩下一棵树,即所要求的树T。算法huffmanTree用最小堆实现优先队列Q。初始化优先队列需要O(
展开阅读全文