




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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<=n;j+) suma + = aj; if(suma > 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
3、 = aleft > 0? a left:0 ;else int center = ( left + 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 r
4、ight_sum =0; for ( int i = center +1; i <= right ; i+) right_sum + = a i; if( right_sum > s2) s2 = right_sum; sum = 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)满足典型的分治算法递
5、归分式T(n)=2T(n/2)+O(n),分治算法的时间复杂度为O(nlogn)3)设,则最大子段和为最大子段和实际就是.要说明最大子段和具有最优子结构性质,只要找到其前后步骤的迭代关系即可。 若, ;若,。因此,计算的动态规划的公式为:intMaxSum (int* a,int n )int sum = 0, b = 0,j=0;for( int i=1;i<=n;i+) if( b >0)b = b + a i;elseb = a i; endifif( b > sum)sum = b; j=i; endifreturn sum;自行推导,答案:时间复杂度为O(n)。2.
6、 动态规划算法的时间复杂度为O(n)(双机调度问题)用两台处理机A和B处理个作业。设第个作业交给机器A处理时所需要的时间是,若由机器B来处理,则所需要的时间是。现在要求每个作业只能由一台机器处理,每台机器都不能同时处理两个作业。设计一个动态规划算法,使得这两台机器处理完这个作业的时间最短(从任何一台机器开工到最后一台机器停工的总的时间)。以下面的例子说明你的算法:解:(思路一)删除(思路二)在完成前k个作业时,设机器A工作了x时间,则机器B最小的工作时间是x的一个函数。设Fkx表示完成前k个作业时,机器B最小的工作时间,则其中对应第k个作业由机器B来处理(完成k-1个作业时机器A工作时间仍是x
7、,则B在k-1阶段用时为);而对应第k个作业由机器A处理(完成k-1个作业,机器A工作时间是x-ak,而B完成k阶段与完成k-1阶段用时相同为)。则完成前k个作业所需的时间为1)当处理第一个作业时,a1=2,b1=3;机器A所花费时间的所有可能值范围:0 £x £a0.x<0时,设F0x= ,则max(x, )= ;0£x<2时,F1x=3,则Max(0,3)=3,x³2时, F1x= 0,则Max(2,0)=2;2)处理第二个作业时:x的取值范围是:0 <= x <= (a0 + a1),当x<0时,记F2x = ;以此类
8、推下去(思路三)假定个作业的集合为。设为的子集,若安排中的作业在机器A上处理,其余作业在机器B上处理,此时所用时间为,则双机处理作业问题相当于确定的子集,使得安排是最省时的。即转化为求使得。若记,则有如下递推关系:(思路四)此问题等价于求(x1,xn),使得它是下面的问题最优解。min maxx1a1+xnan,(1-x1)b1+(1-xn)bn xi=0或1,i=1n基于动态规划算法的思想,对每个任务i,依次计算集合S(i)。其中每个集合中元素都是一个3元组(F1,F2,x)。这个3元组的每个分量定义为F1:处理机A的完成时间F2:处理机B的完成时间x:任务分配变量。当xi=1时表示将任务i
9、分配给处理机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=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)在
10、做上述集合并集的计算时,遵循下面的原则:当(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,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
11、,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,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,1
12、4),(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),(0,1,0,1,0,0)(思路五)C+ 源代码如下:#include <iostream>using namespace std;const int MAXS = 70;c
13、onst 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 = 1; k <= n; k +)for(i = 0; i <= mn; i+)for(j = 0; j <= mn;
14、 j+)if( (i - ak-1) >= 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 <= mn ; j+)if(pijn)temp = i > j ? i : j;if(temp < rs)rs = temp;return rs;void main()int i,n,m = 0,mn = 0;/=初始化=cin >&g
15、t; n;for(i = 0; i < n; i+)cin >> ai;if(ai > m)m = ai;for(i = 0; i < n; i+)cin >> bi;if(bi > m)m = bi;mn = m * n;/=动态规划求解=cout << schduleDyn(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.设令,则上述规划问题转化为:,其中,把看作价值,看作重量,看作背包容量。转化为0/1背包问题,所以可以0/1背包问题的动态规划算法来求
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 重冶萃取工新员工考核试卷及答案
- 焙烧炉焙烧工上岗考核试卷及答案
- 油品装卸工操作考核试卷及答案
- 充填回收工主管竞选考核试卷及答案
- 铁合金炉外法冶炼工设备调试考核试卷及答案
- 蒸馏炉工成本控制考核试卷及答案
- 地理信息应用作业员上岗考核试卷及答案
- 铸管精整工主管竞选考核试卷及答案
- 教育素养考试题及答案
- 中药药剂员工艺考核试卷及答案
- DL∕T 1100.1-2018 电力系统的时间同步系统 第1部分:技术规范
- AQ/T 9009-2015 生产安全事故应急演练评估规范(正式版)
- 2024年大学试题(宗教学)-道教文化笔试考试历年典型考题及考点含含答案
- DZ∕T 0211-2020 矿产地质勘查规范 重晶石、毒重石、萤石、硼(正式版)
- 《电力建设施工技术规范 第3部分:汽轮发电机组》DLT 5190.3
- 重大版小学英语六年级上册全册教案
- 如何正确使用和佩戴劳动防护用品培训课件
- GB/T 43586-2023聚烯烃冷拉伸套管膜
- 癫痫患者的自我管理宣教
- 迁坟工程施工方案
- 公路水运工程试验检测师《水运结构与地基》考试(重点)题库(800题版)
评论
0/150
提交评论