!算法设计与分析总复习.ppt

  1. 1、本文档共50页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
!算法设计与分析总复习要点

7、简述确定性图灵机和非确定性图灵机的区别,并说明何为P类问题,何为NP类问题。 确定性图灵机与非确定性图灵机的区别在于,确定性图灵机的每一步只有一种选择,而非确定性图灵机却可以有多种选择。P类问题是确定性计算模型下的易解问题类,而NP类问题是非确定性计算模型下的易验证问题类。 六、设计计算题 1、假设每一步可迈一个或二个或三个阶梯,请给出爬n个阶梯的递推公式 。 F(n)=0 n0; F(n)=1 n=0; F(n)=F(n-1)+F(n-2)+F(n-3) n0 2、已知有7个独立作业{1,2,3,4,5,6,7}由3台机器M1,M2和M3加工处理。各作业所需的处理时间分别为{2,14,4,16,6,5,3}。请给出利用贪心算法实现多机调度问题的步骤。 解:(1)按处理时间非递减排序{16,14,6,5,4,3,2}; (2)按机器个数建立最小堆,将前三个作业插入最小堆; (3)从堆中移出Min元素; (4)将其加上后序作业的加工时间,插入堆; (5)从第(3)步循环执行,直到所有作业处理完毕。 4 ? 2 7 5 6 3 1 M1 M2 M3 6 11 15 17 3、给定n种物品和一个背包。物品i的重量是wi,体积是bi,其价值为vi,背包的容量为c,容积为d。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大?在选择装入背包的物品时,对每种物品只有两种选择,即装入或不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i。试设计一个解此问题的动态规划算法,并分析算法的计算复杂性。 解:该问题是二维0-1背包问题。问题的形式化描述是,给定c0,d0,wi0, bi0,vi0,1?i?n,要求找出n元0-1 向量(x1,x2,…,xn),xi∈{0,1},1?i?n使得 , 而且 达到最大。 因此,二维0-1背包问题也是一个特殊的整数规划问题。 max 的最优值为m(i,j,k),即m(i,j,k)是背包容量为j,容积为k,可选物品为i,i+1,…,n时二维0-1背包问题的最优解。由二维0-1背包问题的最优子结构性质,可以建立计算m(i,j,k)的递归式如下: 按此递归式计算出的m(n,c,d)为最优值。算法所需的计算时间为O(ncd)。 七、完善下列算法 1、假设合并排序算法的抽象定义为: Public static void mergeSort(Comparable a[], int left, int right) { } 其中使用的合并及拷贝方法分别定义为: Public static void merge(Comparable []c, Comparable []d,int l,int m,int r) { } Public static void copy(Comparable []c, Comparable []d, int i, int j) { } 请补充完善递归方式实现的合并排序的细节。 1、Public static void mergeSort(Comparable a[], int left, int right) { If(leftright){ Int i=(left+right)/2; mergwSort(a,left,i); mergeSort(a,i+1,right); merge(a,b,left,i,right ); copy(a,b,left,right); } } 2、请完善下面用回溯法搜索子集树的一般算法描述,其中由output(x)记录或输出得到的可行解 x[t]表示当前的扩展节点 void backtrack(int t) { If (tn) _① else for(int i=0;_②_____;i++) {_______③_______; if (constraint(t)bound(t)) ______④________; } } 3、请完善下面用回溯法搜索排列树的一般算法描述 void backtrack(int t) { If (tn) output(x) else for(int i=__①__;____②_____;i++) {_______③_______; if (constraint(t)bound(t)) backtrack(t+1

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档