ACM程序设计基础之贪心法ppt课件_第1页
ACM程序设计基础之贪心法ppt课件_第2页
ACM程序设计基础之贪心法ppt课件_第3页
ACM程序设计基础之贪心法ppt课件_第4页
ACM程序设计基础之贪心法ppt课件_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、贪心法的设计思想贪心法的设计思想 贪心法的求解过程贪心法的求解过程贪心法的基本要素贪心法的基本要素 贪心法在解决问题的策略上目光短浅,只根据当前已有的信息就做出选择,而且一旦做出了选择,不管将来有什么结果,这个选择都不会改变。换言之,贪心法并不是从整体最优考虑,它所做出的选择只是在某种意义上的局部最优。 这种局部最优选择并不总能获得整体最优解Optimal Solution),但通常能获得近似最优解Near-Optimal Solution)。1 贪心法的设计思想贪心法的设计思想 例:用贪心法求解付款问题。例:用贪心法求解付款问题。假设有面值为假设有面值为5元、元、2元、元、1元、元、5角、角

2、、2角、角、1角的货币,需角的货币,需要找给顾客要找给顾客4元元6角现金,为使付出的货币的数量最少,首角现金,为使付出的货币的数量最少,首先选出先选出1张面值不超过张面值不超过4元元6角的最大面值的货币,即角的最大面值的货币,即2元,元,再选出再选出1张面值不超过张面值不超过2元元6角的最大面值的货币,即角的最大面值的货币,即2元,元,再选出再选出1张面值不超过张面值不超过6角的最大面值的货币,即角的最大面值的货币,即5角,再选角,再选出出1张面值不超过张面值不超过1角的最大面值的货币,即角的最大面值的货币,即1角,总共付出角,总共付出4张货币。张货币。 在付款问题每一步的贪心选择中,在不超过

3、应付在付款问题每一步的贪心选择中,在不超过应付款金额的条件下,只选择面值最大的货币,而不去考虑款金额的条件下,只选择面值最大的货币,而不去考虑在后面看来这种选择是否合理,而且它还不会改变决定:在后面看来这种选择是否合理,而且它还不会改变决定:一旦选出了一张货币,就永远选定。付款问题的贪心选一旦选出了一张货币,就永远选定。付款问题的贪心选择策略是尽可能使付出的货币最快地满足支付要求,其择策略是尽可能使付出的货币最快地满足支付要求,其目的是使付出的货币张数最慢地增加,这正体现了贪心目的是使付出的货币张数最慢地增加,这正体现了贪心法的设计思想。法的设计思想。贪心法求解的问题的特征:贪心法求解的问题的

4、特征:(1最优子结构性质最优子结构性质 当一个问题的最优解包含其子问题的最优解时,当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质,也称此问题满足最称此问题具有最优子结构性质,也称此问题满足最优性原理。优性原理。(2贪心选择性质贪心选择性质 所谓贪心选择性质是指问题的整体最优解可以所谓贪心选择性质是指问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来得到。通过一系列局部最优的选择,即贪心选择来得到。v 动态规划法通常以自底向上的方式求解各个子问题,而贪心法则通常以自顶向下的方式做出一系列的贪心选择。2 贪心法的求解过程贪心法的求解过程 用贪心法求解问题应该考虑如下几

5、个方面:(1候选集合C:为了构造问题的解决方案,有一个候选集合C作为问题的可能解,即问题的最终解均取自于候选集合C。例如,在付款问题中,各种面值的货币构成候选集合。(2解集合S:随着贪心选择的进行,解集合S不断扩展,直到构成一个满足问题的完整解。例如,在付款问题中,已付出的货币构成解集合。 (3解决函数solution:检查解集合S是否构成问题的完整解。例如,在付款问题中,解决函数是已付出的货币金额恰好等于应付款。 (4选择函数select:即贪心策略,这是贪心法的关键,它指出哪个候选对象最有希望构成问题的解,选择函数通常和目标函数有关。例如,在付款问题中,贪心策略就是在候选集合中选择面值最大

6、的货币。 (5可行函数feasible:检查解集合中加入一个候选对象是否可行,即解集合扩展后是否满足约束条件。例如,在付款问题中,可行函数是每一步选择的货币和已付出的货币相加不超过应付款。 贪心法的一般过程Greedy(C) /C是问题的输入集合即候选集合 S= ; /初始解集合为空集 while (not solution(S) /集合S没有构成问题的一个解 x=select(C); /在候选集合C中做贪心选择 if feasible(S, x) /判断集合S中加入x后的解是否可行 S=S+x; C=C-x; return S;例1、 活动安排问题 活动安排问题就是要在所给的活动集合中选出最

7、大的相容活动子集合,是可以用贪心算法有效求解的很好例子。该问题要求高效地安排一系列争用某一公共资源的活动。贪心算法提供了一个简单、漂亮的方法使得尽可能多的活动能兼容地使用公共资源。例1、活动安排问题 设有n个活动的集合E=1,2,n,其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si fi 。如果选择了活动i,则它在半开时间区间si, fi)内占用资源。若区间si, fi)与区间sj, fj)不相交,则称活动i与活动j是相容的。也就是说,当sifj或sjfi时,活动i与活动j相容。例1

8、、 活动安排问题在下面所给出的解活动安排问题的贪心算法greedySelector :int greedySelector(int s, int f, bool a) int n=strlen(s)-1; a1=true; int j=1; int count=1; for (int i=2;i=fj) ai=true; j=i; count+; else ai=false; return count; 各活动的起始时间和结各活动的起始时间和结束时间存储于数组束时间存储于数组s s和和f f中且按结束时间的非减中且按结束时间的非减序排列序排列 例1、 活动安排问题 由于输入的活动以其完成时间的

9、非减序排列,所以算法greedySelector每次总是选择具有最早完成时间的相容活动加入集合A中。直观上,按这种方法选择相容活动为未安排活动留下尽可能多的时间。也就是说,该算法的贪心选择的意义是使剩余的可安排时间段极大化,以便安排尽可能多的相容活动。 算法greedySelector的效率极高。当输入的活动已按结束时间的非减序排列,算法只需O(n)的时间安排n个活动,使最多的活动能相容地使用公共资源。如果所给出的活动未按非减序排列,可以用O(nlogn)的时间重排。 例1、活动安排问题 例:设待安排的11个活动的开始时间和结束时间按结束时间的非减序排列如下:i12345678910 11Si

10、130535688212fi4567891011121314例1、 活动安排问题 算法greedySelector 的计算过程如左图所示。图中每行相应于算法的一次迭代。阴影长条表示的活动是已选入集合A的活动,而空白长条表示的活动是当前正在检查相容性的活动。例1、 活动安排问题 若被检查的活动i的开始时间Si小于最近选择的活动j的结束时间fi,则不选择活动i,否则选择活动i加入集合A中。 贪心算法并不总能求得问题的整体最优解。但对于活动安排问题,贪心算法greedySelector却总能求得的整体最优解,即它最终所确定的相容活动集合A的规模最大。这个结论可以用数学归纳法证明。3、贪心算法的基本要

11、素 对于一个具体的问题,怎么知道是否可用贪心算法解此问题,以及能否得到问题的最优解呢?这个问题很难给予肯定的回答。 但是,从许多可以用贪心算法求解的问题中看到这类问题一般具有2个重要的性质:贪心选择性质和最优子结构性质。 3 贪心算法的基本要素1.1.贪心选择性质贪心选择性质 所谓贪心选择性质是指所求问题的所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。法与动态规划算法的主要区别。

12、动态规划算法通常以自底向上的方动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。将所求问题简化为规模更小的子问题。 对于一个具体问题,要确定它是否对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优作的贪心选择最终导致问题的整体最优解。解。3 贪心算法的基本要素2.2.最优子结构性质最优子结构性质 当

13、一个问题的最优解包含其子问题当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题性质。问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关可用动态规划算法或贪心算法求解的关键特征。键特征。 贪心与动态规划 【例】在一个NM的方格阵中,每一格子赋予一个数即为权)。规定每次移动时只能向上或向右。现试找出一条路径,使其从左下角至右上角所经过的权之和最大。 贪婪:1 3 4 6 动规:1 2 10 6 局部最优解VS全局最优解3461210例例2、 背包问题背包问题 给定给定n种物品和一个容量为种物品和一个容量为

14、C的背包,物的背包,物品品i的重量是的重量是wi,其价值为,其价值为vi,背包问题是如,背包问题是如何选择装入背包的物品,使得装入背包中物品何选择装入背包的物品,使得装入背包中物品的总价值最大的总价值最大? 0-10-1背包问题:背包问题: 给定给定n n种物品和一个背包。物品种物品和一个背包。物品i i的重量是的重量是WiWi,其价值为,其价值为ViVi,背包的容量,背包的容量为为C C。应如何选择装入背包的物品,使得。应如何选择装入背包的物品,使得装入背包中物品的总价值最大装入背包中物品的总价值最大? ? 在选择装入背包的物品时,对每种物品在选择装入背包的物品时,对每种物品i i只有只有2

15、 2种种选择,即装入背包或不装入背包。不能将物品选择,即装入背包或不装入背包。不能将物品i i装入装入背包多次,也不能只装入部分的物品背包多次,也不能只装入部分的物品i i。 背包问题:背包问题: 与与0-1背包问题类似,所不同的背包问题类似,所不同的是在选择物品是在选择物品i装入背包时,可以选择物装入背包时,可以选择物品品i的一部分,而不一定要全部装入背包,的一部分,而不一定要全部装入背包,1in。 这2类问题都具有最优子结构性质,极为相似,但背包问题可以用贪心算法求解,而0-1背包问题却不能用贪心算法求解。 于是,背包问题归结为寻找一个满足约束条件式于是,背包问题归结为寻找一个满足约束条件

16、式7.1,并使目标函数式并使目标函数式7.2达到最大的解向量达到最大的解向量X=(x1, x2, , xn)。设设xi表示物品表示物品i装入背包的情况,根据问题的要求,装入背包的情况,根据问题的要求,有如下约束条件和目标函数:有如下约束条件和目标函数: )1 (101nixCxwiniii(式(式7.1)niiixv1max(式(式7.2)至少有三种看似合理的贪心策略:至少有三种看似合理的贪心策略: (1选择价值最大的物品,因为这可以尽可能快选择价值最大的物品,因为这可以尽可能快地增加背包的总价值。但是,虽然每一步选择获得地增加背包的总价值。但是,虽然每一步选择获得了背包价值的极大增长,但背包

17、容量却可能消耗得了背包价值的极大增长,但背包容量却可能消耗得太快,使得装入背包的物品个数减少,从而不能保太快,使得装入背包的物品个数减少,从而不能保证目标函数达到最大。证目标函数达到最大。 (2选择重量最轻的物品,因为这可以装入尽可选择重量最轻的物品,因为这可以装入尽可能多的物品,从而增加背包的总价值。但是,虽然能多的物品,从而增加背包的总价值。但是,虽然每一步选择使背包的容量消耗得慢了,但背包的价每一步选择使背包的容量消耗得慢了,但背包的价值却没能保证迅速增长,从而不能保证目标函数达值却没能保证迅速增长,从而不能保证目标函数达到最大。到最大。 (3选择单位重量价值最大的物品,在背包价值选择单

18、位重量价值最大的物品,在背包价值增长和背包容量消耗两者之间寻找平衡。增长和背包容量消耗两者之间寻找平衡。 应用第三种贪心策略,每次从物品集合中选择单位重量价值最大的物品,如果其重量小于背包容量,就可以把它装入,并将背包容量减去该物品的重量,然后我们就面临了一个最优子问题它同样是背包问题,只不过背包容量减少了,物品集合减少了。因此背包问题具有最优子结构性质。 120 50 背包 180 190 200(a) 三个物品及背包 (b) 贪心策略1 (c) 贪心策略2 (d) 贪心策略3 50 30 10 20 20 3020/30 20 1010/20 30 10例如,有例如,有3个物品,其重量分别

19、是个物品,其重量分别是20, 30, 10,价值分,价值分别为别为60, 120, 50,背包的容量为,背包的容量为50,应用三种贪心策,应用三种贪心策略装入背包的物品和获得的价值如图所示。略装入背包的物品和获得的价值如图所示。 设背包容量为C,共有n个物品,物品重量存放在数组wn中,价值存放在数组vn中,问题的解存放在数组xn中。 1改变数组改变数组w和和v的排列顺序,使其按单位重量价值的排列顺序,使其按单位重量价值vi/wi降序排列;降序排列;2将数组将数组xn初始化为初始化为0; /初始化解向量初始化解向量3i=1; 循环直到循环直到(wiC) 1 xi=1; /将第将第i个物品放入背包

20、个物品放入背包 2 C=C-wi; 3 i+;5. xi=C/wi;算法的时间主要消耗在将各种物品依其单位重量的价值从算法的时间主要消耗在将各种物品依其单位重量的价值从大到小排序。因而,其时间复杂性为大到小排序。因而,其时间复杂性为O(nlog2n)。#include #include #include #include #include #include #include #include #include #include using namespace std;using namespace std;struct thingstruct thing double wi,vi,vwi; d

21、ouble wi,vi,vwi;an10000;an10000;int cmp(thing i,thing j)int cmp(thing i,thing j) return i.vwi j.vwi; return i.vwi j.vwi; int main()int main() int n,c; int n,c; while(cinnc)while(cinnc) for(int i=0;in;i+) for(int i=0;iani.wiani.vi; cinani.wiani.vi; ani.vwi=ani.vi/ani.wi; ani.vwi=ani.vi/ani.wi; sort(a

22、n,an+n,cmp); sort(an,an+n,cmp); int step=0; int step=0; double cost=0; double cost=0; for(int i=0;in;i+) for(int i=0;i=c) if(step=c) break; break; if(c-step)=ani.wi) if(c-step)=ani.wi) step += ani.wi; step += ani.wi; cost += ani.vi; cost += ani.vi; else else cost += ani.vwi cost += ani.vwi* *(c-(c-s

23、tep);step); step=c; step=c; coutcostendl; coutcostendl; return 0; return 0; 对于0-1背包问题,贪心选择之所以不能得到最优解是因为在这种情况下,它无法保证最终能将背包装满,部分闲置的背包空间使每公斤背包空间的价值降低了。事实上,在考虑0-1背包问题时,应比较选择该物品和不选择该物品所导致的最终方案,然后再作出最好选择。由此就导出许多互相重叠的子问题。这正是该问题可用动态规划算法求解的另一重要特征。 实际上也是如此,动态规划算法的确可以有效地解0-1背包问题。 #include #include #include #in

24、clude #include #include #include #include #include #include using namespace std;using namespace std;struct thingstruct thing int wi,vi; int wi,vi;an10000;an10000; int dp10000;int dp10000;int main()int main() int n,c; int n,c; while(cinnc) while(cinnc) for(int i=0;in;i+) for(int i=0;iani.wiani.vi; ci

25、nani.wiani.vi; memset(dp,0,sizeof(dp); memset(dp,0,sizeof(dp); for(int i=0;in;i+) for(int i=0;i=ani.wi;j-) for(int j=c;j=ani.wi;j-) dpj=max(dpj,dpj-ani.wi+ani.vi); dpj=max(dpj,dpj-ani.wi+ani.vi); coutdpcendl; coutdpcendl; return 0; return 0; 例3 最优装载 有一批集装箱要装上一艘载重量为c的轮船。其中集装箱i的重量为Wi。最优装载问题要求确定在装载体积不受

26、限制的情况下,将尽可能多的集装箱装上轮船。1.算法描述最优装载问题可用贪心算法求解。采用重量最轻者先装的贪心选择策略,可产生最优装载问题的最优解。具体算法描述如下页。 最优装载2.2.贪心选择性质贪心选择性质 可以证明最优装载问题具有贪心选择性质。可以证明最优装载问题具有贪心选择性质。 3.3.最优子结构性质最优子结构性质最优装载问题具有最优子结构性质。最优装载问题具有最优子结构性质。由最优装载问题的贪心选择性质和最优子由最优装载问题的贪心选择性质和最优子结构性质,容易证明算法结构性质,容易证明算法loadingloading的正确性。的正确性。算法算法loadingloading的主要计算量

27、在于将集装箱依的主要计算量在于将集装箱依其重量从小到大排序,故算法所需的计算时间其重量从小到大排序,故算法所需的计算时间为为 O(nlogn) O(nlogn)。 例4、 单源最短路径给定带权有向图G =(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到所有其他各顶点的最短路长度。这里路的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。1.算法基本思想(迪科斯彻算法)Dijkstra算法是解单源最短路径问题的贪心算法。 例4、 单源最短路径其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短

28、路径长度已知。初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist作必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其他顶点之间的最短路径长度。 例4、 单源最短路径例如,对右图中的有向图,应用Dijkstra算法计算从源顶点1到其他顶点间最短路径的过程列在下页的表中。 例4、 单源最短路径迭代迭代S Su udist2dist2 dist3dist3 dist4dist4

29、 dist5dist5初始初始1-10maxint301001 11,221060301002 21,2,44105030903 31,2,4,33105030604 41,2,4,3,5510503060Dijkstra算法的迭代过程: 4 单源最短路径2.2.算法的正确性和计算复杂性算法的正确性和计算复杂性(1)(1)贪心选择性质贪心选择性质(2)(2)最优子结构性质最优子结构性质(3)(3)计算复杂性计算复杂性对于具有对于具有n n个顶点和个顶点和e e条边的带权有向图,条边的带权有向图,如果用带权邻接矩阵表示这个图,那么如果用带权邻接矩阵表示这个图,那么DijkstraDijkstra

30、算法的主循环体需要算法的主循环体需要 时间。这个时间。这个循环需要执行循环需要执行n-1n-1次,所以完成循环需要次,所以完成循环需要 时间。算法的其余部分所需要时间不超时间。算法的其余部分所需要时间不超过过 。)(nO)(2nO)(2nO 5 最小生成树 设G =(V,E)是无向连通带权图,即一个网络。E中每条边(v,w)的权为cvw。如果G的子图G是一棵包含G的所有顶点的树,则称G为G的生成树。生成树上各边权的总和称为该生成树的耗费。在G的所有生成树中,耗费最小的生成树称为G的最小生成树。网络的最小生成树在实际中有广泛应用。例如,在设计通信网络时,用图的顶点表示城市,用边(v,w)的权cv

31、w表示建立城市v和城市w之间的通信线路所需的费用,则最小生成树就给出了建立通信网络的最经济的方案。 6 最小生成树1.1.最小生成树性质最小生成树性质用贪心算法设计策略可以设计出构造最小用贪心算法设计策略可以设计出构造最小生成树的有效算法。本节介绍的构造最小生成生成树的有效算法。本节介绍的构造最小生成树的树的PrimPrim算法和算法和KruskalKruskal算法都可以看作是应算法都可以看作是应用贪心算法设计策略的例子。尽管这用贪心算法设计策略的例子。尽管这2 2个算法个算法做贪心选择的方式不同,它们都利用了下面的做贪心选择的方式不同,它们都利用了下面的最小生成树性质:最小生成树性质:设设

32、G=(V,E)G=(V,E)是连通带权图,是连通带权图,U U是是V V的真子集。的真子集。假如假如(u,v)(u,v)E E,且,且u uU U,v vV-UV-U,且在所有这,且在所有这样的边中,样的边中,(u,v)(u,v)的权的权cuvcuv最小,那么一定最小,那么一定存在存在G G的一棵最小生成树,它以的一棵最小生成树,它以(u,v)(u,v)为其中一为其中一条边。这个性质有时也称为条边。这个性质有时也称为MSTMST性质。性质。 5 最小生成树2.Prim2.Prim算法算法 设设G=(V,E)G=(V,E)是连通带权图,是连通带权图,V=1,2,nV=1,2,n。构造构造G G的

33、最小生成树的的最小生成树的PrimPrim算法的基本思算法的基本思想是:首先置想是:首先置S=1S=1,然后,只要,然后,只要S S是是V V的真子的真子集,就作如下的贪心选择:选取满足条件集,就作如下的贪心选择:选取满足条件i iS S,j jV-SV-S,且,且cijcij最小的边,将顶点最小的边,将顶点j j添加到添加到S S中。这个过程一直进行到中。这个过程一直进行到S=VS=V时为止。时为止。在这个过程中选取到的所有边恰好构成在这个过程中选取到的所有边恰好构成G G的一棵最小生成树。的一棵最小生成树。 5 最小生成树利用最小生成树性质和数学归纳法容易证明,上述算法中的边集合T始终包含

34、G的某棵最小生成树中的边。因而,在算法结束时,T中的所有边构成G的一棵最小生成树。 例如,对于右图中的带权图,按Prim算法选取边的过程如下页图所示。 5 最小生成树 5 最小生成树在上述Prim算法中,还应当考虑如何有效地找出满足条件iS,jV-S,且权cij最小的边(i,j)。实现这个目的的较简单的办法是设置2个数组closest和lowcost。在Prim算法执行过程中,先找出V-S中使lowcost值最小的顶点j,然后根据数组closest选取边(j,closestj),最后将j添加到S中,并对closest和lowcost作必要的修改。用这个办法实现的Prim算法所需的计算时间为 )

35、(2nO 5 最小生成树3.Kruskal3.Kruskal算法算法KruskalKruskal算法构造算法构造G G的最小生成树的基的最小生成树的基本思想是,首先将本思想是,首先将G G的的n n个顶点看成个顶点看成n n个孤个孤立的连通分支。将所有的边按权从小到立的连通分支。将所有的边按权从小到大排序。然后从第一条边开始,依边权大排序。然后从第一条边开始,依边权递增的顺序查看每一条边,并按下述方递增的顺序查看每一条边,并按下述方法连接法连接2 2个不同的连通分支:当查看到第个不同的连通分支:当查看到第k k条边条边(v,w)(v,w)时,如果端点时,如果端点v v和和w w分别是当分别是当

36、前前2 2个不同的连通分支个不同的连通分支T1T1和和T2T2中的顶点时,中的顶点时,就用边就用边(v,w)(v,w)将将T1T1和和T2T2连接成一个连通分连接成一个连通分支,然后继续查看第支,然后继续查看第k+1k+1条边;如果端点条边;如果端点v v和和w w在当前的同一个连通分支中,就直在当前的同一个连通分支中,就直接再查看第接再查看第k+1k+1条边。这个过程一直进行条边。这个过程一直进行到只剩下一个连通分支时为止。到只剩下一个连通分支时为止。 5 最小生成树例如,对前面的连通带权图,按例如,对前面的连通带权图,按KruskalKruskal算法顺序得到的算法顺序得到的最小生成树上的

37、边如下图所示。最小生成树上的边如下图所示。 5 最小生成树关于集合的一些基本运算可用于实现Kruskal算法。 按权的递增顺序查看等价于对优先队列执行removeMin运算。可以用堆实现这个优先队列。 对一个由连通分支组成的集合不断进行修改,需要用到抽象数据类型并查集UnionFind所支持的基本运算。当图的边数为e时,Kruskal算法所需的计算时间是 。当 时,Kruskal算法比Prim算法差,但当 时,Kruskal算法却比Prim算法好得多。)log(eeO)(2ne)(2noe 键盘输入一个高精度的正整数键盘输入一个高精度的正整数N,去掉其中任意,去掉其中任意S个数字后个数字后剩下

38、的数字按原左右次序将组成一个新的正整数。编程对给剩下的数字按原左右次序将组成一个新的正整数。编程对给定的定的N和和S,寻找一种方案使得剩下的数字组成的新数最小。,寻找一种方案使得剩下的数字组成的新数最小。 输入数据均不需判错。输出应包括所去掉的数字的位置和输入数据均不需判错。输出应包括所去掉的数字的位置和组成的新的正整数组成的新的正整数 例6、删数游戏 问题分析问题分析 在位数固定的前提下,让高位的数字尽量小其值就较小,依据在位数固定的前提下,让高位的数字尽量小其值就较小,依据此贪婪策略就可以解决这个问题。此贪婪策略就可以解决这个问题。 怎么样根据贪婪策略删除数字呢?总目标是删除高位较大的数怎么样根据贪婪策略删除数字呢?总目标是删除高位较大的数字,具体地相邻两位比较若高位比低位大则删除高位。我们通过字,具体地相邻两位比较若高位比低位大则删除高位。我们通过“枚举归纳设计算法的细节,看一个实例枚举归纳设计算法的细节,看一个实例s=3) : n1=“

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论