《算法设计与分析》第06章.ppt
《《算法设计与分析》第06章.ppt》由会员分享,可在线阅读,更多相关《《算法设计与分析》第06章.ppt(96页珍藏版)》请在三一办公上搜索。
1、第6章 贪心法,Greedy Algorithm,1,找零问题,假如售货员需要找给小孩67美分的零钱。现在,售货员手中只有25美分、10美分、5美分和1美分的硬币。在小孩的催促下,售货员想尽快将钱找给小孩。她的做法是:先找不大于67美分的最大硬币25美分硬币,再找不大于672542美分的最大硬币25美分硬币,再找不大于422517美分的最大硬币10美分硬币,再找不大于17107美分的最大硬币5美分硬币,最后售货员再找出两个1美分的硬币。至此,售货员共找给小孩6枚硬币。售货员的原则是拿尽可能少的硬币个数找给小孩。从另一个角度看,如果售货员将捡出的硬币逐一放在手中,最后一起交给小孩,那么售货员想使
2、自己手中的钱数增加的尽量快些,所以每一次都尽可能地捡面额大的硬币。,2,贪心法就是 只顾眼前利益,每次都选最好的。总是作出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题它能产生整体最优解。但其解必然是最优解的很好近似解。,3,6.1 一般方法 6.2 背包问题 6.3 带时限的作业排序 6.4 最佳合并模式 6.5 最小代价生成树 6.6 单源最短路径 6.7 磁带最优存储 6.8 贪心法的基本要素*贪心法的应用,4,6.1 一般方法,5,最优化问题(optimization
3、 problems)是指这样一类问题,问题给定某些约束条件(constraint),满足这些约束条件的问题解称为可行解(feasible solution)。通常满足约束条件的解不是惟一的。为了衡量可行解的好坏,问题还给出了某个数值函数,称为目标函数(objective function),使目标函数取最大(或最小)值的可行解称为最优解(optimal solution)。,6,贪心法是通过分步决策(stepwise decision)的方法来求解问题的。贪心法每一步上用作决策依据的选择准则被称为最优量度标准(optimization criterion)。在根据最优量度标准选择分量的过程中,
4、还需要使用一个可行解判定函数。贪心策略并不是从整体上加以考虑的,它所做出的选择只是当前看似最佳选择,必须进一步证明该算法最终导致问题的一个整体最优解。,7,【程序61】贪心法SolutionType Greedy(SType a,int n)SolutionType solution=;for(int i=0;in;i+)SType x=Select(a);if(Feasiable(solution,x)solution=Union(solution,x);return solution;,8,6.2 背包问题,9,6.2.1 问题描述,已知一个载重为M的背包和n件物品,第i件物品的重量为 w
5、i,如果将第i件物品全部装入背包,将有收益pi,这里,wi0,pi0,0in。所谓背包问题是指求一种最佳装载方案,使得收益最大。所以,背包问题是现实世界一个常见的最优化问题。两类背包问题:如果每一件物品不能分割,只能作为整体或者装入背包,或者不装入,称为 0/1背包问题;如果物品是可以分割的,也就是允许将其中的一部分装入背包为一般背包问题或简称背包问题。,10,6.2.2 贪心法求解,背包问题 背包问题的解可以表示成一个n-元组:X=(x0,x1,xn1),0 xi1,0in,每个xi是第i件物品装入背包中的部分。判定可行解的约束条件是:,11,背包问题的最优解必须使下列目标函数取最大值:,1
6、2,例61 设有载重能力M=20的背包,3件物品的重量为:(w0,w1,w2)=(18,15,10),物品装入背包的收益为:(p0,p1,p2)=(25,24,15)。,13,【程序62】背包问题的贪心算法 templateclass Knapsack public:Knapsack(int mSize,float cap,float*wei,T*prof);void GreedyKnapsack(float*x);private:float m,*w;T*p;int n;,14,templatevoid Knapsack:GreedyKnapsack(float*x)/前置条件:wi已按pi
7、/wi的非增次序排列 float u=m;for(int i=0;iu)break;xi=1.0;u=u-wi;if(i=n)xi=u/wi;,15,6.2.3 算法正确性,定理61 如果p0/w0p1/w1pn1/wn1,则程序62求得的背包问题的解是最优解。,16,6.3 带时限的作业排序,17,问题描述,设有一个单机系统、无其它资源限制且每个作业运行相等时间,不妨假定每个作业运行1个单位时间。现有n个作业,每个作业都有一个截止期限di0,di为整数。如果作业能够在截止期限之内完成,可获得pi0的收益。问题要求得到一种作业调度方案,该方案给出作业的一个子集和该作业子集的一种排列,使得若按照
8、这种排列次序调度作业运行,该子集中的每个作业都能如期完成,并且能够获得最大收益。也就是说这种作业调度是最优的。,18,6.3.2 贪心法求解,例62 设有4个作业,每个作业的时限为(d0,d1,d2,d3)=(2,1,2,1),收益为(p0,p1,p2,p3)=(100,10,15,27)。,19,20,【程序63】带时限作业排序的贪心算法 void GreedyJob(int d,Set X,int n)/前置条件:p0p1,pn-1 X=0;for(int i=1;in;i+)if(集合 Xi 中作业都能在给定时限内完成)X=Xi;,21,算法正确性,定理62 程序63的贪心算法对于带时限
9、作业排序问题将得到最优解。,22,23,24,可行性判定,定理63 X=(x0,x1,xk)是k个作业的集合,=(0,1,k)是X 的一种特定排列,它使得d0=d1=dk,其中,dj是作业j的时限。X是一个可行解当且仅当X中的作业能够按次序调度而不会有作业超期。,25,26,6.3.5 作业排序贪心算法,定理63提供了一种高效的可行解判定方法。使得在按最优量度标准,即按作业收益的非增次序选择下一个作业后,可以有效地判定是否可将该作业加入已生成的部分解向量X。,27,【程序64】带时限的作业排序程序int JS(int*d,int*x,int n)/设p0p1pn-1 int k=0;x0=0;
10、for(int j=1;j=0,28,6.3.6 一种改进算法,本小节将介绍一种带时限作业排序的快速算法,它采用不同于前者的可行解判定方法,可使算法的时间从(n2)减少到接近O(n)。,29,30,例63 设n=5个作业,作业的时限为:(d0,d1,d2,d3,d4)=(2,2,1,3,3),收益为:(p0,p1,p2,p3,p4)=(20,15,10,5,1)。,31,32,【程序65】使用并查集的带时限作业排序 int FJS(int*d,int*x,int n)UFSet s(n);int b,k=-1,*f=new intn+1;for(int i=0;i=n;i+)fi=i;,33,
11、for(i=0;in;i+)if(ndi)b=n;else b=di;int r=s.Find(b);if(fr)x+k=i;int t=s.Find(fr-1);s.Union(t,r);fr=ft;delete f;return k;,34,35,6.4 最佳合并模式,36,问题描述,两路合并外排序算法通过反复执行将两个有序子文件合并成一个有序文件的操作,最终将n个长度不等的有序子文件合并成一个有序文件。合并n个有序子文件成为一个有序文件的合并过程可以有多种方式,称为合并模式。在整个合并过程中,需从外存读写的记录数最少的合并方案称为最佳合并模式(optimal merge pattern)
12、。,37,例64 设有5个有序子文件(F1,F2,F3,F4,F5),其长度分别为(20,30,30,10,5)。现通过两两合并将其合并成一个有序文件。,38,带权外路径长度是针对扩充二叉树而言的。扩充二叉树(extended binary tree)中除叶子结点外,其余结点都必须有两个孩子。扩充二叉树的带权外路径长度(weighted external path length)定义为:,39,贪心法求解,两路合并最佳模式问题的最优量度标准为带权外路径长度最小。,40,两路合并最佳模式的贪心算法简述如下:设Ww0,w1,wn1是n个有序文件的长度;以每个权值作为根结点值,构造n棵只有根的二叉树
13、;选择两棵根结点权值最小的树,作为左右子树构造一棵新二叉树,新树根的权值是两棵子树根的权值之和;重复第2步,直到合并成一棵二叉树为止。,41,【程序66】两路合并最佳模式的贪心算法templatestruct HNode/优先权队列中的元素的类型 operator T()const return weight;BTNode*ptr;T weight;,42,template BTNode*CreateHfmTree(T*w,int n)/w 为一维数组保存n个权值PrioQueue pq(2*n-1);BTNode*p;HNode a,b;for(int i=0;i(wi);a.ptr=p;a
14、.weight=wi;pq.Append(a);,43,for(i=1;i(a.weight,a.ptr,b.ptr);a.ptr=p;pq.Append(a);pq.Serve(a);return a.ptr;,44,6.4.3 算法正确性,定理64设有n个权值W=w0,w1,wn1作为外结点的权值,构造两路合并树的贪心算法将生成一棵具有最小带权外路径长度的二叉树。,45,46,6.5 最小代价生成树,47,问题描述,问题一个无向连通图的生成树是一个极小连通子图,它包括图中全部结点,并且有尽可能少的边。一棵生成树的代价是树中各条边上的代价之和。一个网络的各生成树中,具有最小代价的生成树称为该
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法设计与分析 算法 设计 分析 06

链接地址:https://www.31ppt.com/p-5903454.html