ImageVerifierCode 换一换
格式:DOC , 页数:10 ,大小:201KB ,
文档编号:5855655      下载积分:20 文币
快捷下载
登录下载
邮箱/手机:
温馨提示:
系统将以此处填写的邮箱或者手机号生成账号和密码,方便再次下载。 如填写123,账号和密码都是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

优惠套餐
 

温馨提示:若手机下载失败,请复制以下地址【https://www.163wenku.com/d-5855655.html】到电脑浏览器->登陆(账号密码均为手机号或邮箱;不要扫码登陆)->重新下载(不再收费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录  
下载须知

1: 试题类文档的标题没说有答案,则无答案;主观题也可能无答案。PPT的音视频可能无法播放。 请谨慎下单,一旦售出,概不退换。
2: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
3: 本文为用户(2023DOC)主动上传,所有收益归该用户。163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

1,本文(算法分析习题详细答案五(DOC 8页).doc)为本站会员(2023DOC)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!

算法分析习题详细答案五(DOC 8页).doc

1、1最大子段和问题:给定整数序列 ,求该序列形如的子段和的最大值: 1) 已知一个简单算法如下:int Maxsum(int n,int a,int& best i,int& bestj) int sum = 0; for(int i=1;i=n;i+) int suma = 0;for(int j=i;j sum) sum = suma; besti = i; bestj = j; return sum;试分析该算法的时间复杂性。2) 试用分治算法解最大子段和问题,并分析算法的时间复杂性。3) 试说明最大子段和问题具有最优子结构性质,并设计一个动态规划算法解最大子段和问题。分析算法的时间复杂度

2、。(提示:令)解:1)分析按照第一章,列出步数统计表,计算可得 2)分治算法:将所给的序列a1:n分为两段a 1:n/2、an/2+1:n,分别求出这两段的最大子段和,则a1:n的最大子段和有三种可能:a1:n的最大子段和与a1:n/2的最大子段和相同;a1:n的最大子段和与an/2+1:n的最大子段和相同;a1:n的最大子段和为两部分的字段和组成,即;intMaxSubSum ( int *a, int left , int right)int sum =0;if( left=right) sum = aleft 0? a left:0 ;else int center = ( left +

3、 right) /2;int leftsum =MaxSubSum ( a, left , center) ; int rightsum =MaxSubSum ( a, center +1, right) ; int s_1 =0; int left_sum =0; for ( int i = center ; i = left; i-) left_sum + = a i ; if( left_sum s1) s1 = left_sum; int s2 =0; int right_sum =0; for ( int i = center +1; i s2) s2 = right_sum; su

4、m = s1 + s2; if ( sum leftsum) sum = leftsum; if ( sum rightsum) sum = rightsum; return sum;int MaxSum2 (int n) int a; returnMaxSubSum ( a, 1, n) ; 该算法所需的计算时间T(n)满足典型的分治算法递归分式T(n)=2T(n/2)+O(n),分治算法的时间复杂度为O(nlogn)3)设,则最大子段和为最大子段和实际就是.要说明最大子段和具有最优子结构性质,只要找到其前后步骤的迭代关系即可。 若, ;若,。因此,计算的动态规划的公式为:intMaxSum

5、 (int* a,int n )int sum = 0, b = 0,j=0;for( int i=1;i0)b = b + a i;elseb = a i; endifif( b sum)sum = b; j=i; endifreturn sum;自行推导,答案:时间复杂度为O(n)。2. 动态规划算法的时间复杂度为O(n)(双机调度问题)用两台处理机A和B处理个作业。设第个作业交给机器A处理时所需要的时间是,若由机器B来处理,则所需要的时间是。现在要求每个作业只能由一台机器处理,每台机器都不能同时处理两个作业。设计一个动态规划算法,使得这两台机器处理完这个作业的时间最短(从任何一台机器开工

6、到最后一台机器停工的总的时间)。以下面的例子说明你的算法:解:(思路一)删除(思路二)在完成前k个作业时,设机器A工作了x时间,则机器B最小的工作时间是x的一个函数。设Fkx表示完成前k个作业时,机器B最小的工作时间,则其中对应第k个作业由机器B来处理(完成k-1个作业时机器A工作时间仍是x,则B在k-1阶段用时为);而对应第k个作业由机器A处理(完成k-1个作业,机器A工作时间是x-ak,而B完成k阶段与完成k-1阶段用时相同为)。则完成前k个作业所需的时间为1)当处理第一个作业时,a1=2,b1=3;机器A所花费时间的所有可能值范围:0 x a0.x0时,设F0x= ,则max(x, )=

7、 ;0x2时,F1x=3,则Max(0,3)=3,x2时, F1x= 0,则Max(2,0)=2;2)处理第二个作业时:x的取值范围是:0 = x = (a0 + a1),当x0时,记F2x = ;以此类推下去(思路三)假定个作业的集合为。设为的子集,若安排中的作业在机器A上处理,其余作业在机器B上处理,此时所用时间为,则双机处理作业问题相当于确定的子集,使得安排是最省时的。即转化为求使得。若记,则有如下递推关系:(思路四)此问题等价于求(x1,xn),使得它是下面的问题最优解。min maxx1a1+xnan,(1-x1)b1+(1-xn)bn xi=0或1,i=1n基于动态规划算法的思想,

8、对每个任务i,依次计算集合S(i)。其中每个集合中元素都是一个3元组(F1,F2,x)。这个3元组的每个分量定义为F1:处理机A的完成时间F2:处理机B的完成时间x:任务分配变量。当xi=1时表示将任务i分配给处理机A,当xi=0时表示分配给处理机B。初始时,S(0)=(0,0,0)令F=按处理时间少的原则来分配任务的方案所需的完成时间。例如,当(a1,a2,a3,a4,a5,a6)=(2,5,7,10,5,2),(b1,b2,b3,b4,b5,b6)=(3,8,4,11,3,4)时,按处理时间少的原则分配任务的方案为(x1,x2,x3,x4,x5,x6)=(1,1,0,1,0,1)因此,F=

9、max2+5+10+2,7+5=19。然后,依次考虑任务i,i=1n。在分配任务i时,只有2种情形,xi=1或xi=0。此时,令S(i)=S(i-1)+(ai,0,2i)US(i-1)+(0,bi,0)在做上述集合并集的计算时,遵循下面的原则:当(a,b,c),(d,e,f)S(i)且a=d,b=e时,仅保留(a,b,c);仅当maxa,b=F时,(a,b,c)S(i)最后在S(n)中找出使maxF1,F2达到最小的元素,相应的x即为所求的最优解,其最优值为maxF1,F2。当(a1,a2,a3,a4,a5,a6)=(2,5,7,10,5,2),(b1,b2,b3,b4,b5,b6)=(3,8

10、,4,11,3,4)时, 按处理时间少的原则分配任务的方案为(x1,x2,x3,x4,x5,x6)=(1,1,0,1,0,1)因此,F=max2+5+10+2,7+5=19。S(0)=(0,0,0);S(1)=(2,0,2),(0,3,0)S(2)=(7,0,6),(5,3,4),(2,8,2),(0,11,0)S(3)=(14,0,14),(12,3,12),(9,8,10), (7,4,6), (5,7,4),(2,12,2),(0,15,0)S(4)=(19,8,26), (17,4,22),(15,7,20),(12,12,18),(14,11,14),(9,19,10),(7,15,

11、6),(5,18,4)S(5)= (19,11,46), (12,15,38), (19,11,26), (17,7,22), (15,10,20),(12,15,18),(14,14,14),(7,18,6)S(6)= (14,15,102),(19,7,86),(17,10,84),(14,15,82), (9,18,70),(12,19,38), (15,14,20),(12,19,18)max(F1,F2)最小的元组为(14,15,102), (14,15,82), (15,14,20)所以,完成所有作业最短时间是15,安排有三种:(1,1,0,0,1,1),(1,0,0,1,0,1)

12、,(0,1,0,1,0,0)(思路五)C+ 源代码如下:#include using namespace std;const int MAXS = 70;const int MAXN = 10;bool pMAXSMAXSMAXS;int aMAXS,bMAXS;int schduleDyn(int * a,int * b,int n,int mn)int i,j,k;/=数组初始化=for(i = 0; i = mn; i+)for(j = 0; j = mn; j+)pij0 = true;for(k = 1 ; k = n; k+)pijk = false;/=动态递归=for(k =

13、1; k = n; k +)for(i = 0; i = mn; i+)for(j = 0; j = 0) pijk = pi - ak-1jk-1;if( (j - bk-1) = 0)pijk = (pijk | pij-bk-1k-1);/=求结果=int rs = mn;int temp = 0;for(i = 0; i = mn; i+)for(j = 0; j j ? i : j;if(temp n;for(i = 0; i ai;if(ai m)m = ai;for(i = 0; i bi;if(bi m)m = bi;mn = m * n;/=动态规划求解=cout schdu

14、leDyn(a,b,n,mn) endl;system(pause);对于例子: n = 6 ;(a1,.,a6) = (2 5 7 10 5 2),(b,1,b6) = (3 8 4 11 3 4);由于求解过程比较繁锁,这里只说个大概算法执行过程,首先,用pijk,记录下对于第k个作业,能否在对于a机器是i时间以内,对于b机器是j时间以内完成,如果能,则把pijk设为true.经过了设置后,求对于n个作业的所有可能的值为pijn,对min(max(i,j),结果为15.即为所得到的结果.3考虑下面特殊的整数线性规划问题试设计一个解此问题的动态规划算法,并分析算法的时间复杂度。解:方法1.设

15、令,则上述规划问题转化为:,其中,把看作价值,看作重量,看作背包容量。转化为0/1背包问题,所以可以0/1背包问题的动态规划算法来求解。由于n件物品的0/1背包的时间复杂性是O(2n),则此时为O(4n)。方法2. 可以看成是另一种背包问题。即b为背包容量,为背包中可以装0,1,或者2件物品,对应的价值为,求在容量b 一定的前提下,背包所容纳的物品的最大价值。也就是参数完全相同的两个0-1背包问题,它们同时制约于背包容量为C这个条件。在设计算法时可以优先考虑,也就是先判断背包剩下的容量能不能放进去,若可以再判断能否使,若可以则就再放入一个,这样就间接满足了的条件。(以上各题均来自同学们作业中的思想,仅供参考,自行整理答案。)109 / 10

侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|