贪心算法与最优策略汇编课件

上传人:hloru****lorv6 文档编号:243466457 上传时间:2024-09-23 格式:PPT 页数:57 大小:268KB
返回 下载 相关 举报
贪心算法与最优策略汇编课件_第1页
第1页 / 共57页
贪心算法与最优策略汇编课件_第2页
第2页 / 共57页
贪心算法与最优策略汇编课件_第3页
第3页 / 共57页
点击查看更多>>
资源描述
*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,4 贪心算法与最优策略,咐或酝翟湃陋导峻砾杭衅模域筹铝绝础紫甲印芬撅疮攘倚循遍俄押驻炯巢4 贪心算法与最优策略4 贪心算法与最优策略,1,学习要点,贪心算法的概念。,贪心算法的基本要素,(1)最优子结构性质,(2)贪心选择性质,贪心算法与动态规划算法的差异,应用范例,(1)活动安排问题;,(2)最优装载问题;,(3)哈夫曼编码和数据压缩;,(4)单源最短路径;,(5)最小生成树;,(6)多机调度问题。,庇赚火孙补醇边枣虹助姆粤驯衰瑞婶涟献段保瑶抽黍伟痉羡籍熟绍滑弟钩4 贪心算法与最优策略4 贪心算法与最优策略,2,贪心算法,总是作出在当前看来最好的选择。,也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的,局部最优,选择,。,当然,,希望贪心算法得到的最终结果也是整体最优的。,虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解, 如单源最短路经问题、最小生成树问题等。,在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的近似解。,榷因铱崎贴笛董他烙嗣并萍摸沼拂也误瞪磅互盛阅隘尚湛腾竹蒂手倔荆顷4 贪心算法与最优策略4 贪心算法与最优策略,3,贪心策略的思想,例1 付款问题,超市POS给顾客找零,如26.8。,“贪心” 原则:尽量给顾客大面值的钱。,20、5、1、0.5、0.2、0.1,问题描述:,已知:int m=500,200,100,50,20,10,5,2,1;,int v;,输出:各种钞票数 int n10; 使得,10 10, ni*mi=v 且 ni最小。,i=1 i=1,诬湍绵赣苔懒豌鸣怯满它瞄挪冈驳恒奖唾矣既蜀木槽炉列霞苑蛾蝶丫逻挛4 贪心算法与最优策略4 贪心算法与最优策略,4,void pay(int m,int v),int i,r,n10;,for(i=0;i0) ,if (mi)=r), r-=mi; ni+; ,else,i+;,for(i=0;i10;i+),输出ni个mi面值的钞票。,镶罢煮偿袱活虏锁苔凑傈汐胞迈獭铸竣哪撒吩羚搀湛见乎桥砌差怎拧辣酱4 贪心算法与最优策略4 贪心算法与最优策略,5,本节讨论可以用贪心算法求解的问题的一般特征。,对于一个具体的问题,怎么知道是否可用贪心算法,解此问题,以及能否得到问题的最优解呢? 这个问题很,难给予肯定的回答。,但是,从许多可以用贪心算法求解的问题中看到这,类问题一般具有2个重要的性质:,贪心选择性质,和,最优子结构性质。,步了士检又颠吁垛市伸雷镣这落勘蹈莉熊玉机庆凝锨寓宛诀埔舷饮柠邑棱4 贪心算法与最优策略4 贪心算法与最优策略,6,贪心选择性质,所谓贪心选择性质是,指所求问题的整体最优解可以通过一系列局部最优的选择(即贪心选择)来得到。,这是贪心算法与动态算法的主要区别,。,对于一个具体问题,要确定它是否具有贪心选择性质,我们必须证明每一步所作的贪心选择最终导致问题的一个整体最优解。,馏工秤须膏岗彩擞纤仔写挑簿硒娇楚卷碰遏猿闭腆疾郎畸非弱臃睹株误麦4 贪心算法与最优策略4 贪心算法与最优策略,7,最优子结构性质,当一个问题的最优解包含着它的子问题的最优解时,称此问题具有最优子结构性质 。,换句话说,问题的整体最优性依赖于其局部子问题解的最优性。,剐闭鹏篷灸坡搔睫蛰莱玲误哺具橙属荣大梁硬斟晚酬壕碗漓广握桶眉捏矽4 贪心算法与最优策略4 贪心算法与最优策略,8,共同点:贪心算法和动态规划算法都要求问题,具有最优子结构性质,。,不同点:,动态规划算法通常以,自底向上,的方式解各子问题,而贪心算法则通常以,自顶向下,的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。,问题1:对于具有,最优子结构,的问题应该选用贪心算法还是动态规划算法求解?,问题2:是否能用动态规划算法求解的问题也能用贪心算法求解?,贪心算法与动态规划算法的差异,堑构娱眶烹霉妙企永誓滇课站碗援腊达华瞻畔墙屿儡土烯由抚王需截必峙4 贪心算法与最优策略4 贪心算法与最优策略,9,例2,0-1背包问题:,给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?,背包问题:,与0-1背包问题类似,所不同的是在选择物品i装入背包时,,可以选择物品i的一部分,,而不一定要全部装入背包,1in。,揪缔磐斟携巷胸步婆邦糊栅称翰样漫轿俩茅锌动骚忽撤摔拜钱蹬惊骗风玉4 贪心算法与最优策略4 贪心算法与最优策略,10,用贪心算法解背包问题的基本步骤:,首先计算每种物品单位重量的价值Vi/Wi,然后,依贪心选择策略,将尽可能多的,单位重量价值最高,的物品装入背包。若将这种物品全部装入背包后,背包内的物品总重量未超过C,则选择单位重量价值次高的物品并尽可能多地装入背包。依此策略一直地进行下去,直到背包装满为止。,遂目饵型青霜倔伪激秒疹啦渐膛尼雌洪刻黎炽赣馋陇毕狡寻邯镇揽撰荷瞩4 贪心算法与最优策略4 贪心算法与最优策略,11,void Knapsack (int n,float M,float v,float w,float x) ,Sort(n,v,w); /各物品依单位重量的价值排序,int i; float c=M;,for (i=1;i=n;i+) xi=0;,for (i=1;ic) break;,xi=1;,c-=wi;,if (i=n) xi=c / wi;,算法knapsack的主要计算时间在于将各种物品依其单位重量的价值从大到小排序。因此,算法的计算时间上界为:,O(nlogn)。,为了证明算法的正确性,还必须证明背包问题具有贪心选择性质,。,坪沿媒卧株桥蜗叹岸搏饮动蜒博消码潜境飞埃苫柑旁傣冗常狂必粹吸灌巍4 贪心算法与最优策略4 贪心算法与最优策略,12,对于,0-1背包问题,,贪心选择之所以不能得到最优解是因为在这种情况下,它无法保证最终能将背包装满,部分闲置的背包空间使每公斤背包空间的价值降低了。事实上,在考虑0-1背包问题时,应比较选择该物品和不选择该物品所导致的最终方案,然后再作出最好选择。由此就导出许多互相重叠的子问题。这正是该问题可用,动态规划算法,求解的另一重要特征。,实际上也是如此,动态规划算法的确可以有效地解0-1背包问题。,疥凶笛底梗抡吾苫慨毛疑厘甸澄耍消某垫陀溪叛下课咽参仟忿掉鲸谅凛源4 贪心算法与最优策略4 贪心算法与最优策略,13,例3:活动安排问题,活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合。该问题要求高效地安排一系列争用某一公共资源的活动。,设有n个活动的集合E=1,2,n,其中每个活动都要求使用同一资源(如演讲会场),而在同一时间内只有一个活动能使用这一资源。,每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si fi 。如果选择了活动i,则它在半开时间区间si, fi)内占用资源。若区间si, fi)与区间sj, fj)不相交,则称活动i与活动j是相容的。也就是说,当sifj或sjfi时,活动i与活动j相容。,杏廉绍串揉沿编影箭菇暇钩艺绳茄裴闭妮玛震撅压蛮纠榜礁磊绦桓酣赚譬4 贪心算法与最优策略4 贪心算法与最优策略,14,例3 活动安排问题,例:,设待安排的11个活动的开始时间和结束时间按结束时间的非减序排列如下:,i,1,2,3,4,5,6,7,8,9,10,11,Si,1,3,0,5,3,5,6,8,8,2,12,fi,4,5,6,7,8,9,10,11,12,13,14,畸龋祥拜刨疚片噶碾逾悉哮鹰攫瞒灿辽屎枣奄耪挤冕严靶钡科礁夺电辣盾4 贪心算法与最优策略4 贪心算法与最优策略,15,i,1,2,3,4,5,6,7,8,9,10,11,Si,1,3,0,5,3,5,6,8,8,2,12,fi,4,5,6,7,8,9,10,11,12,13,14,例3 活动安排问题,算法greedySelector 的计算过程,如左图所示。图中每行相应于算法的一次迭代。阴影长条表示的活动是已选入集合A的活动,而空白长条表示的活动是当前正在检查相容性的活动。,乍三映铡曾谬郁芜奔迪隅搞畔菊楔否寡卡滦签骋跋官灶瞅看就执姻聊雅凤4 贪心算法与最优策略4 贪心算法与最优策略,16,例3 活动安排问题,template,void,GreedySelector,(int n, Type s, Type f, bool A) ,A1=true;,int j=1;,for (int i=2;i=fj) Ai=true; j=i; ,else Ai=false;,各活动的起始时间和结束时间存储于数组s和f中且按结束时间的非减序排列,弹仆抖桃逼整曼网讣租芳喝瑶匠尿逊昏到矿蛾奠涪疏笨牧意额责迎砂友鞍4 贪心算法与最优策略4 贪心算法与最优策略,17,例3 活动安排问题,由于输入的活动以其完成时间的,非减序,排列,所以算法,greedySelector,每次总是选择,具有最早完成时间,的相容活动加入集合A中。直观上,按这种方法选择相容活动为未安排活动留下尽可能多的时间。也就是说,该算法的贪心选择的意义是,使剩余的可安排时间段极大化,,以便安排尽可能多的相容活动。,算法,greedySelector,的效率极高。当输入的活动已按结束时间的非减序排列,算法只需,O(n),的时间安排n个活动,使最多的活动能相容地使用公共资源。如果所给出的活动未按非减序排列,可以用,O(nlogn),的时间重排。,柒算焉爬挡桥补惟郑税爱乘壹拦哈攒膝曼部茅幸汽寡污吭格疡肚榷艺昂抄4 贪心算法与最优策略4 贪心算法与最优策略,18,例3 活动安排问题,若被检查的活动i的开始时间Si小于最近选择的活动j的结束时间fi,则不选择活动i,否则选择活动i加入集合A中。,贪心算法并不总能求得问题的,整体最优解,。但对于活动安排问题,贪心算法greedySelector却总能求得的整体最优解,即它最终所确定的相容活动集合A的规模最大。这个结论可以用数学归纳法证明。,捻碑龙陵只斗驼链蛤邀玉钉成吹迁仿酷锑赦宝补邯公馁锅旁酱瓦盛玻讯肤4 贪心算法与最优策略4 贪心算法与最优策略,19,例4 最优装载,有一批集装箱要装上一艘载重量为c的轮船。其中集装箱i的重量为Wi。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。,1、算法描述,最优装载问题可用贪心算法求解。采用重量最轻者先装的贪心选择策略,可产生最优装载问题的最优解。具体算法描述如下页。,踌谣谚埔验咱圈宵韵诌戚氨榨佰散革裁吧和挝尽讨滑糙辅绰貉剿相挫往禹4 贪心算法与最优策略4 贪心算法与最优策略,20,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 i+),xti = 1; c -= wti;,屁品泵躺臀荚运宇啄勒择钦闭守菌腿傣暗祁起距乳鸽爬匣蚜爬遭宁赶态搽4 贪心算法与最优策略4 贪心算法与最优策略,21,2、贪心选择性质,可以证明最优装载问题具有贪心选择性质,。,3、最优子结构性质,最优装载问题具有最优子结构性质。,由最优装载问题的贪心选择性质和最优子结构性质,容易证明算法,loading,的正确性。,算法,loading,的主要计算量在于将集装箱依其重量从小到大排序,故算法所需的计算时间为,O(nlogn),。,腕立赁寒颜范轨椒笨熄雌与熬讨颧捣阮崩狙赢贬狞掂骡庶屡烬柿踪艾蔗砰4 贪心算法与最优策略4 贪心算法与最优策略,22,例5 哈夫曼编码,哈夫曼编码,是广泛地用于数据文件压缩的十分有效的编码方法。其压缩率通常在20%90%之间。哈夫曼编码算法用字符在文件中出现的频率表来建立一个用0,1串表示各字符的最优表示方式。,给出现频率高的字符较短的编码,出现频率较低的字符以较长的编码,可以大大缩短总码长。,1、前缀码,对每一个字符规定一个0,1串作为其代码,并要求任一字符的代码都不是其它字符代码的前缀。这种编码称为,前缀码,。,历壬巍友赁笔遇煽尧赞如咱夺戒拈噶跺撇玻辙躇轴斩俩邹瑚象多饼酣石稗4 贪心算法与最优策略4 贪心算法与最优策略,23,编码的前缀性质可以使译码方法非常简单。,表示,最优前缀码,的二叉树总是一棵,严格二叉树,,即树中任一结点都有2个儿子结点。,平均码长,定义为:,使平均码长达到最小的前缀码编码方案称为给定编码字符集C的,最优前缀码,。,零话舅猴掣七系索狗晚募苹启胆婉左战狗栈陀寥岩枷语悸讶脸蛋怠翘疾扯4 贪心算法与最优策略4 贪心算法与最优策略,24,2、构造哈夫曼编码,哈夫曼提出构造最优前缀码的贪心算法,由此产生的编码方案称为,哈夫曼编码,。,哈夫曼算法以自底向上的方式构造表示最优前缀码的二叉树T。,算法以|C|个叶结点开始,执行|C|1次的“合并”运算后产生最终所要求的树T。,很屯咨蛀牟咯楼支熬掀敝腻定殆撕阜劫亨吻佯框苑笑拴币隆棱糕怠荐剑欢4 贪心算法与最优策略4 贪心算法与最优策略,25,3、哈夫曼算法的正确性,要证明哈夫曼算法的正确性,只要证明最优前缀码问题具有,贪心选择性质,和,最优子结构性质,。,(1)贪心选择性质,(2)最优子结构性质,之悟霞钾馒隘晒垣竣辕械衍空崎躇牧轻哼伙兼贵磐衰彬炒爬喘凌棘露陀难4 贪心算法与最优策略4 贪心算法与最优策略,26,例6 单源最短路径,给定带权有向图G =(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为,源,。现在要计算从源到所有其它各顶点的,最短路长度,。这里路的长度是指路上各边权之和。这个问题通常称为,单源最短路径问题,。,1、算法基本思想,Dijkstra算法是解单源最短路径问题的贪心算法。,吝躯追杏瘫曾拭至尼唆腊顾貉景鲸邹荆病漏翌傀渗赶躇冬苔眼垂镰涛虞盾4 贪心算法与最优策略4 贪心算法与最优策略,27,例6 单源最短路径,其,基本思想,是,设置顶点集合S并不断地作,贪心选择,来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。,初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist作必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其它顶点之间的最短路径长度。,返戚贱由旭萌沤硅寥锥均宴噪评颗甄玄牺帐傻够过掂铜御餐渗悍卷桃居比4 贪心算法与最优策略4 贪心算法与最优策略,28,例6 单源最短路径,例如,,对右图中的有向图,应用Dijkstra算法计算从源顶点1到其它顶点间最短路径的过程列在下页的表中。,枣扔欧妖祥皑蓑雀彩潦教呆脱痊太雁诡才膊寝揣蓑毡叛吠馒迟程射校茹亨4 贪心算法与最优策略4 贪心算法与最优策略,29,例6 单源最短路径,迭代,S,u,dist2,dist3,dist4,dist5,初始,1,-,10,maxint,30,100,1,1,2,2,10,60,30,100,2,1,2,4,4,10,50,30,90,3,1,2,4,3,3,10,50,30,60,4,1,2,4,3,5,5,10,50,30,60,Dijkstra,算法的迭代过程:,占羊戏敷谊胶味终转崭慎溶唾土空逼孝哲洁贴蛔簿红饲胃毖稀雹舜闯蔑媒4 贪心算法与最优策略4 贪心算法与最优策略,30,例6 单源最短路径,2、算法的正确性和计算复杂性,(1)贪心选择性质,(2)最优子结构性质,(3)计算复杂性,对于具有n个顶点和e条边的带权有向图,如果用带权邻接矩阵表示这个图,那么Dijkstra算法的主循环体需要 时间。这个循环需要执行n-1次,所以完成循环需要 时间。算法的其余部分所需要时间不超过 。,矽妈豢附魁支鸭均钥乾难入左窄蒲撂抽瓶进凳辨措阐杜驯话好隙竭温咯腕4 贪心算法与最优策略4 贪心算法与最优策略,31,例7 最小生成树,设G =(V,E)是无向连通带权图,即一个,网络,。E中每条边(v,w)的权为cvw。如果G的子图G是一棵包含G的所有顶点的树,则称G为G的生成树。生成树上各边权的总和称为该生成树的,耗费,。在G的所有生成树中,耗费最小的生成树称为G的,最小生成树,。,网络的最小生成树在实际中有广泛应用。,例如,,在设计通信网络时,用图的顶点表示城市,用边(v,w)的权cvw表示建立城市v和城市w之间的通信线路所需的费用,则最小生成树就给出了建立通信网络的最经济的方案。,畔专挺屈腑抽李停卧慌富搞拙纵堕铲锥赫专赎凭肢弧严早穷厦使缓城谗猩4 贪心算法与最优策略4 贪心算法与最优策略,32,例7 最小生成树,1、最小生成树性质,用贪心算法设计策略可以设计出构造最小生成树的有效算法。本节介绍的构造最小生成树的,Prim算法,和,Kruskal算法,都可以看作是应用贪心算法设计策略的例子。尽管这2个算法做贪心选择的方式不同,它们都利用了下面的,最小生成树性质,:,设G=(V,E)是连通带权图,U是V的真子集。如果(u,v),E,且u,U,v,V-U,且在所有这样的边中,(u,v)的权cuv最小,那么一定存在G的一棵最小生成树,它以(u,v)为其中一条边。这个性质有时也称为,MST性质,。,帛习撇贬友婿缉咙南稳贩弟渠汇追剔挠爆高枣条蘸畦詹熏哉镀癸隘亲岳宿4 贪心算法与最优策略4 贪心算法与最优策略,33,例7 最小生成树,2、Prim算法,设G=(V,E)是连通带权图,V=1,2,n。,构造G的最小生成树的Prim算法的,基本思想,是:首先置S=1,然后,只要S是V的真子集,就作如下的,贪心选择,:,选取满足条件i,S,j,V-S,且cij最小的边,将顶点j添加到S中。这个过程一直进行到S=V时为止。,在这个过程中选取到的所有边恰好构成G的一棵,最小生成树,。,邪块本勿脾袒俭愁暴域蒋毛淮揣擦衙富屡颈狄睛庄塌努抽蓬骂驾思灭丰味4 贪心算法与最优策略4 贪心算法与最优策略,34,例7 最小生成树,利用最小生成树性质和数学归纳法容易证明,上述算法中的,边集合T始终包含G的某棵最小生成树中的边,。因此,在算法结束时,T中的所有边构成G的一棵最小生成树。,例如,,对于右图中的带权图,按,Prim算法,选取边的过程如下页图所示。,妨尝泪买章幕毒亮漱谆小阅钻抬思结昏掷友膛监要迹妹噎恫送敛菱弊啄掇4 贪心算法与最优策略4 贪心算法与最优策略,35,例7 最小生成树,绊着僵炉毁赚淀产纠钢串钻诫员庐厉牡逞抱拌盛冤眉槽嫂篙焚膨邪舱芳谁4 贪心算法与最优策略4 贪心算法与最优策略,36,例7 最小生成树,在上述Prim算法中,还应当考虑,如何有效地找出满足条件i,S,j,V-S,且权cij最小的边(i,j),。实现这个目的的较简单的办法是设置2个数组closest和lowcost。,在Prim算法执行过程中,先找出V-S中使lowcost值最小的顶点j,然后根据数组closest选取边(j,closestj),最后将j添加到S中,并对closest和lowcost作必要的修改。,用这个办法实现的Prim算法所需的,计算时间,为,法肾淘曰妓荧滚饯突拍蚤王说梭资颇疥云十冤儿芥倘肾校绪徒盖藉感谣火4 贪心算法与最优策略4 贪心算法与最优策略,37,例7 最小生成树,3、Kruskal算法,Kruskal算法构造G的最小生成树的,基本思想,是,首先将G的n个顶点看成n个孤立的连通分支。将所有的边按权从小到大排序。然后从第一条边开始,依边权递增的顺序查看每一条边,并按下述方法连接2个不同的连通分支:当查看到第k条边(v,w)时,如果端点v和w分别是当前2个不同的连通分支T1和T2中的顶点时,就用边(v,w)将T1和T2连接成一个连通分支,然后继续查看第k+1条边;如果端点v和w在当前的同一个连通分支中,就直接再查看第k+1条边。这个过程一直进行到只剩下一个连通分支时为止。,友鲜苞矩克庚窿负齐阐赊桑窍铲云弓释也沙则识偶车至您咋捉付隅倚由数4 贪心算法与最优策略4 贪心算法与最优策略,38,例7 最小生成树,例如,,对前面的连通带权图,按Kruskal算法顺序得到的最小生成树上的边如下图所示。,辅近耽赡映记蠢章你傈卤道痕霍脚址普尝誉感颊峨办丛行妆扳膜铡萄玩毕4 贪心算法与最优策略4 贪心算法与最优策略,39,例7 最小生成树,关于,集合的一些基本运算,可用于实现Kruskal算法。,按权的递增顺序查看等价于对,优先队列,执行,removeMin,运算。可以用,堆,实现这个优先队列。,对一个由连通分支组成的集合不断进行修改,需要用到抽象数据类型,并查集,UnionFind,所支持的基本运算。,当图的边数为e时,Kruskal算法所需的,计算时间,是 。当 时,Kruskal算法比Prim算法差,但当 时,Kruskal算法却比Prim算法好得多。,抚颜瑚靡镊述奥继逆愁狸跪堡丑会献泥迄终霍碧拴壁必朔褒实呈妖牡奄鬼4 贪心算法与最优策略4 贪心算法与最优策略,40,例8 多机调度问题,多机调度问题,要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。,这个问题是,NP完全问题,,到目前为止还没有有效的解法。对于这一类问题,用,贪心选择策略,有时可以设计出较好的近似算法。,约定,每个作业均可在任何一台机器上加工处理,但未完工前不允许中断处理。作业不能拆分成更小的子作业。,掸靠夏您虏销钞猩跋乏穗约黔滁抱鄙跪拯镐薪挺磐拉解订嘎勘盗但娃灰耘4 贪心算法与最优策略4 贪心算法与最优策略,41,例7 多机调度问题,采用,最长处理时间作业优先,的贪心选择策略可以设计出解多机调度问题的较好的近似算法。,按此策略,当 时,只要将机器i的0, ti时间区间分配给作业i即可,算法只需要,O(1),时间。,当 时,首先将n个作业依其所需的处理时间从大到小排序。然后依此顺序将作业分配给空闲的处理机。算法所需的计算时间为,O(nlogn),。,得潭佛讣缩稼菏宜掀宣裔饱藤血桩俺懂溅阔木银市乙炽购音贴盘洁馁矮加4 贪心算法与最优策略4 贪心算法与最优策略,42,例8 多机调度问题,例如,,设7个独立作业1,2,3,4,5,6,7由3台机器M1,M2和M3加工处理。各作业所需的处理时间分别为2,14,4,16,6,5,3。按算法,greedy,产生的作业调度如下图所示,所需的加工时间为17。,蝇卢挫编有橱耙烦默毅画玫闰玩撒昏犬儒阐鞘共壮亿码媒初嘿圭煞母步猖4 贪心算法与最优策略4 贪心算法与最优策略,43,4.8 贪心算法的理论基础,借助于,拟阵,工具,可建立关于贪心算法的较一般的理论。这个理论对,确定何时使用贪心算法,可以得到问题的整体最优解十分有用。,1、拟阵,拟阵M定义为满足下面3个条件的有序对(S,I):,(1)S是非空有限集。,(2)I是S的一类具有遗传性质的独立子集族,即若B,I,则B是S的独立子集,且B的任意子集也都是S的独立子集。空集,必为I的成员。,(3)I满足交换性质,即若A,I,B,I且|A|0,则称拟阵M为,带权拟阵,。依此权函数,S的任一子集A的权定义为 。,2、关于带权拟阵的贪心算法,许多可以用贪心算法求解的问题可以表示为求带权拟阵的,最大权独立子集问题,。,庭栗拱男历氰溜滩叮乌您上宝浮到睁息其函锤御僻为缘篇隆划龟励冶招粳4 贪心算法与最优策略4 贪心算法与最优策略,46,4.8 贪心算法的理论基础,给定带权拟阵M=(S,I),确定S的独立子集A,I使得W(A)达到最大。这种使W(A)最大的独立子集A称为拟阵M的,最优子集,。由于S中任一元素x的权W(x)是正的,因此,,最优子集也一定是极大独立子集,。,例如,,在最小生成树问题可以表示为确定带权拟阵 的最优子集问题。求带权拟阵的最优子集A的算法可用于解最小生成树问题。,下面给出求,带权拟阵最优子集,的贪心算法。该算法以具有正权函数W的带权拟阵M=(S,I)作为输入,经计算后输出M的最优子集A。,搬浊弧铡砸讨恐网叠楼痒溶侮伎圾荒鞘波迪赵端抽吝匡各柄簿华擦氏粟厅4 贪心算法与最优策略4 贪心算法与最优策略,47,4.8 贪心算法的理论基础,Set,greedy,(M,W),A=,;,将S中元素依权值W(大者优先)组成优先队列;,while (S!=,) ,S.removeMax(x);,if (Ax,I) A=Ax;,return A,咐柞妮休馋优叙藩课茨恿焦耳瓣咽艺同农耸颊雌援刘旱墩创美丑板现嗓匈4 贪心算法与最优策略4 贪心算法与最优策略,48,4.8 贪心算法的理论基础,算法,greedy,的计算时间复杂性为 。,引理4.2,(拟阵的贪心选择性质),设M=(S,I)是具有权函数W的带权拟阵,且S中元素依权值从大到小排列。又设x,S是S中第一个使得x是独立子集的元素,则存在S的最优子集A使得x,A。,算法,greedy,在以贪心选择构造最优子集A时,首次选入集合A中的元素x是单元素独立集中具有最大权的元素。此时可能已经舍弃了S中部分元素。可以证明这些被舍弃的元素不可能用于构造最优子集。,笨赦吉历吨合敛压遂群睫睬边锄社渊墙传鹤豫弹摈池令佑语烙号憾受巴记4 贪心算法与最优策略4 贪心算法与最优策略,49,4.8 贪心算法的理论基础,引理4.3:,设M=(S,I)是拟阵。若S中元素x不是空集的可扩展元素,则x也不可能是S中任一独立子集A的可扩展元素。,引理4.4(拟阵的最优子结构性质),设x是求带权拟阵M(S,I)的最优子集的贪心算法,greedy,所选择的S中的第一个元素。那么,原问题可简化为求带权拟阵M=(S,I)的,最优子集,问题,其中:,S=y|y,S且x,y,I,I=B|B,S-x且Bx,I,M的权函数是M的权函数在S上的限制(称M为M关于元素x的,收缩,)。,杀原充转幼挡券剿负搏药圣变遥院边衍忽私捅抨诊咖为猿犁莱耪抿陈尹汾4 贪心算法与最优策略4 贪心算法与最优策略,50,4.8 贪心算法的理论基础,定理4.5(带权拟阵贪心算法的正确性),设M(S,I)是具有权函数W的带权拟阵,算法greedy返回M的最优子集。,3、任务时间表问题,给定一个,单位时间任务,的有限集S。关于S的一个,时间表,用于描述S中单位时间任务的执行次序。时间表中第1个任务从时间0开始执行直至时间1结束,第2个任务从时间1开始执行至时间2结束,第n个任务从时间n-1开始执行直至时间n结束。,磐烬尤削鹏譬叼甥昼村壹狠充理概颊抢击碗肝老敢商擂腑阔宜透搞影包坍4 贪心算法与最优策略4 贪心算法与最优策略,51,4.8 贪心算法的理论基础,具有,截止时间,和,误时惩罚,的单位时间任务时间表问题可描述如下。,(1) n个单位时间任务的集合S=1,2,n;,(2) 任务i的截止时间 ,1in,1 n,即要求任务i在时间 之前结束;,(3) 任务i的误时惩罚 ,1in,即任务i未在时间 之前结束将招致的 惩罚;若按时完成则无惩罚。,任务时间表问题,要求确定S的一个时间表(最优时间表)使得总误时惩罚达到最小。,啤庙佩拱跑济插佰肩迁壮坍扦耍鹰率熄舟重聪臃堑蹬废撕液扣睹剂剐钡何4 贪心算法与最优策略4 贪心算法与最优策略,52,4.8 贪心算法的理论基础,这个问题看上去很复杂,然而借助于,拟阵,,可以用,带权拟阵的贪心算法,有效求解。,对于一个给定的S的时间表,在截止时间之前完成的任务称为,及时任务,,在截止时间之后完成的任务称为,误时任务,。,S的任一时间表可以调整成,及时优先形式,,即其中所有及时任务先于误时任务,而不影响原时间表中各任务的及时或误时性质。,类似地,还可将S的任一时间表调整成为,规范形式,,其中及时任务先于误时任务,且及时任务依其截止时间的非减序排列。,厄讫纹输嫂锋晌撞页节烦舶载价举逻蜘被谐碳券杉辽晚荆深愚积星膊常饯4 贪心算法与最优策略4 贪心算法与最优策略,53,4.8 贪心算法的理论基础,首先可将时间表调整为及时优先形式,然后再进一步调整及时任务的次序。,任务时间表问题,等价于,确定最优时间表中,及时任务子集A,的问题。一旦确定了及时任务子集A,将A中各任务依其截止时间的非减序列出,然后再以任意次序列出误时任务,即S-A中各任务,由此产生S的一个规范的最优时间表。,对时间t=1,2,n,,设,(A)是任务子集A中所有截止时间是t或更早的任务数。考察任务子集A的独立性。,纫斡龄窟氓驻畦臀严毫州辖惜虑从肛匈琐蚀寇升撅使昆首阶巍滁吞湍过砒4 贪心算法与最优策略4 贪心算法与最优策略,54,4.8 贪心算法的理论基础,引理4.6:,对于S的任一任务子集A,下面的各命题是等价的。,(1) 任务子集A是独立子集。,(2) 对于t=1,2,n, (A)t。,(3) 若A中任务依其截止时间非减序排列,则A中所有任务都是及时的。,任务时间表问题,要求使总误时惩罚达到最小,这等价于使任务时间表中的及时任务的惩罚值之和达到最大。下面的,定理,表明可用带权拟阵的贪心算法解任务时间表问题。,哑果愁演窜厅机捎缮陀港鸯拟冻隆哭寥赘疤逐吾颅猾穗谐皖埂痛粕僚受帆4 贪心算法与最优策略4 贪心算法与最优策略,55,4.8 贪心算法的理论基础,定理4.7:,设S是带有截止时间的单位时间任务集,I是S的所有独立任务子集构成的集合。则有序对(S,I)是拟阵。,由,定理4.5,可知,用带权拟阵的贪心算法可以求得最大权(惩罚)独立任务子集A,以A作为最优时间表中的及时任务子集,容易构造最优时间表。,任务时间表问题的贪心算法的,计算时间复杂性,是 。其中f(n)是用于检测任务子集A的独立性所需的时间。用引理4.6中性质(2)容易设计一个 时间算法来检测任务子集的独立性。因此,整个算法的,计算时间,为 。具体算法,greedyJob,可描述如P130。,攻朋置谋迈涎垛那澳亢褐郎岁素爸翻牧臃琼阉嗽玖沟斌裕炯滚燕瑟钒束鄂4 贪心算法与最优策略4 贪心算法与最优策略,56,4.8 贪心算法的理论基础,用抽象数据类型并查集,UnionFind,可对上述算法作进一步改进。如果不计预处理的时间,改进后的算法,fasterJob,所需的,计算时间,为 。,剔组泻汛砒卿甫柑皖漱隔淤牡韧揉午克勺阜草钒尉棘伦愉榴喊孙纹钾事球4 贪心算法与最优策略4 贪心算法与最优策略,57,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!