算法分析与设计文档 (1)
- 格式:doc
- 大小:25.50 KB
- 文档页数:6
第一章习题(1-1,1-2,1-3,1-6)1-1 求下列函数的渐进表达式3n2+10n = O(n2)n2/10+2n = O(2n)21+1/n = O(1)logn3 = O(logn)10log3n = O(n)知识点:如果存在正的常数C和自然数N0,使得:当N>=N0时有f(N)<=Cg(N),则称f(N)当N充分大时上有界,且g(N)是它的一个上界,记为f(N)=O(g(N)).这时,可以说f(N)的阶不高于g(N)的阶。
1-2 论O(1)和O(2)的区别O(1)和O(2)差别仅在于其中的常数因子,根据渐进上界记号O的定义可知,O(1)=O(2)。
1-3 从低到高排列以下表达式(按渐进阶排列以下表达式)结果:2 logn n2/320n 4n23n n! 分析:当n>=1时,有logn< n2/3当n>=7时,有3n < n!补充:当n>=4时,有logn> n1/31-6 对于下列各组函数f(n)和g(n),确定f(n)=O(g(n))或f(n)=Ω(g(n))或f(n)=Θ(g(n))。
知识点:f(n)的阶不高于g(n)的阶:f(n)=O(g(n));f(n)的阶不低于g(n)的阶:f(n)=Ω(g(n));f(n)与g(n) 同阶:f(n)=Θ(g(n)) (1)f(n)= logn2 ; g(n)= logn+5f(n)与g(n)同阶,故f(n)=Θ(g(n)) (2) f(n)= logn2 ; g(n)= n1/2当n>=8时,f(n)<=g(n),故f(n)=O(g(n))分析:此类题目不易直接看出阶的高低,可用几个数字代入观察结果。
如依次用n=1, 21, 22, 23, 26, 28, 210 (3) f(n)= n ; g(n)= log2nf(n)=Ω(g(n))(4) f(n)= nlogn+n; g(n)= lognf(n)=Ω(g(n))(5) f(n)= 10 ; g(n)= log10f(n)=Θ(g(n))(6) f(n)= log2n ; g(n)= lognf(n)=Ω(g(n))(7) f(n)= 2n ; g(n)= 100 n2f(n)=Ω(g(n))(8) f(n)= 2n ; g(n)= 3nf(n)=O(g(n))。
《算法及其分析》课后选择题答案及详解第1 章——概论1.下列关于算法的说法中正确的有()。
Ⅰ.求解某一类问题的算法是唯一的Ⅱ.算法必须在有限步操作之后停止Ⅲ.算法的每一步操作必须是明确的,不能有歧义或含义模糊Ⅳ.算法执行后一定产生确定的结果A.1个B.2个C.3个D.4个2.T(n)表示当输入规模为n时的算法效率,以下算法效率最优的是()。
A.T(n)=T(n-1)+1,T(1)=1B.T(n)=2nC.T(n)= T(n/2)+1,T(1)=1D.T(n)=3nlog2n答案解析:1.答:由于算法具有有穷性、确定性和输出性,因而Ⅱ、Ⅲ、Ⅳ正确,而解决某一类问题的算法不一定是唯一的。
答案为C。
2.答:选项A的时间复杂度为O(n)。
选项B的时间复杂度为O(n)。
选项C 的时间复杂度为O(log2n)。
选项D的时间复杂度为O(nlog2n)。
答案为C。
第3 章─分治法1.分治法的设计思想是将一个难以直接解决的大问题分割成规模较小的子问题,分别解决子问题,最后将子问题的解组合起来形成原问题的解。
这要求原问题和子问题()。
A.问题规模相同,问题性质相同B.问题规模相同,问题性质不同C.问题规模不同,问题性质相同D.问题规模不同,问题性质不同2.在寻找n个元素中第k小元素问题中,如快速排序算法思想,运用分治算法对n个元素进行划分,如何选择划分基准?下面()答案解释最合理。
A.随机选择一个元素作为划分基准B.取子序列的第一个元素作为划分基准C.用中位数的中位数方法寻找划分基准D.以上皆可行。
但不同方法,算法复杂度上界可能不同3.对于下列二分查找算法,以下正确的是()。
A.intbinarySearch(inta[],intn,int x){intlow=0,high=n-1;while(low<=high){intmid=(low+high)/2;if(x==a[mid])returnmid;if(x>a[mid])low=mid;elsehigh=mid;}return –1;}B.intbinarySearch(inta[],intn,int x) { intlow=0,high=n-1;while(low+1!=high){intmid=(low+high)/2;if(x>=a[mid])low=mid;elsehigh=mid;}if(x==a[low])returnlow;elsereturn –1;}C.intbinarySearch(inta[],intn,intx) { intlow=0,high=n-1;while(low<high-1){intmid=(low+high)/2;if(x<a[mid])high=mid;elselow=mid;}if(x==a[low])returnlow;elsereturn –1;}D.intbinarySearch(inta[],intn,int x) {if(n>0&&x>=a[0]){intlow= 0,high=n-1;while(low<high){intmid=(low+high+1)/2;if(x<a[mid])high=mid-1;elselow=mid;}if(x==a[low])returnlow;}return –1;}答案解析:1.答:C。
一、解:设第k月的需求量为Nk(k=1,2,3,4)状态变量Xk:第k月初的库存量,X1=X5=0,0≤Xk≤Nk+…+N4决策变量Uk:第k月的生产量,max{0,Nk-Xk}≤Uk≤min{6,Nk+…+N4 - Xk}状态转移方程:X k+1 = Uk + Xk – Nk第k月的成本Vk = 0.5*(Xk - Nk) Uk=03 + Uk + 0.5*(Uk + Xk - Nk) Uk≠0设F k(Xk)是由第k月初的库存量Xk开始到第4月份结束这段时间的最优成本则F k(Xk) = min{Vk + F k+1(X k+1)} 1≤k≤4= min{ 3 + Uk + 0.5*(Uk + Xk - Nk) + F k+1(Uk + Xk - Nk) } Uk≠0min{ 0.5*(Xk - Nk) + F k+1(Xk - Nk) } Uk=0 F5(X5)=0四个月内的最优成本为F1(X1)=F1(0)详细计算步骤如下:(1)k=4时4(2)k=3时(3)k=2时(4)k=1时由以上计算可得,4个月的总最优成本为F1(0) = 20.5(千元)二、解:1、变量设定阶段k:已遍历过k个结点,k=1,2…6,7。
K=1表示刚从V1出发,k=7表示已回到起点V1状态变量Xk=(i,Sk):已遍历k个结点,当前位于i结点,还未遍历的结点集合为Sk。
则X1=(1,{2,3,4,5,6}),X6=(i,Φ),X7=(1,Φ)决策变量Uk=(i,j):已遍历k个结点,当前位于i结点,下一个结点选择j。
状态转移方程:X k+1 = T(Xk,Uk) = (j,Sk-{j})第k阶段的指标函数Vk = D[i,j]。
最优指标函数Fk(Xk) = Fk(i,Sk):已遍历k个结点,当前从i结点出发,访问Sk中的结点一次且仅一次,最后返回起点V1的最短距离。
则Fk(i,Sk) = min{ D[i,j] + F k+1(j,Sk-{j}) } 1≤k≤6F7(X7) = F7(1,Φ) = 02、分析:(1)k=6时,F6(i,Φ) = min{D[i,1] + F7(X7)} = D[i,1] i=2,3,4,5,63、伪代码和时间复杂度为方便计算,结点编号改为0到5.(1)用一张二维表格F[][]表示F(i,Sk),行数是n,列数是2n-1。
一、已知下列递推式:C(n) = 1 若n =1= 2C (n/2) + n – 1 若n ≥ 2请由定理1 导出C(n)的非递归表达式并指出其渐进复杂性。
定理1:设a,c 为非负整数,b,d,x 为非负常数,并对于某个非负整数k, 令n=c k ,则以下递推式f(n) =d 若 n=1=af(n/c)+bn x 若 n>=2的解是f(n)= bnx log c n + dn x 若 a=c x f(n)= x x x ax xn c a bc n c a bc d c log 若 a ≠c x解:令F(n) = C(n) – 1则 F(n) = 0 n=1F(n) = 2C(n/2) + n – 2 n>=2= 2[F(n/2) + 1] + n – 2= 2F(n/2) + n利用定理1,其中:d=0,a=2,c=2,b=1,x=1,并且a=cx 所以 F(n) = nlog 2n所以 C(n) = F(n) + 1 = nlog 2n + 1C(n)的渐进复杂性是O(nlog 2n)二、由于Prim 算法和Kruskal 算法设计思路的不同,导致了其对不同问题实例的效率对比关系的不同。
请简要论述:1、如何将两种算法集成,以适应问题的不同实例输入;2、你如何评价这一集成的意义?答:1、Prim 算法基于顶点进行搜索,所以适合顶点少边多的情况。
Kruskal 从边集合中进行搜索,所以适合边少的情况。
根据输入的图中的顶点和边的情况,边少的选用kruskal 算法,顶点少的选用prim 算法2、没有一个算法是万能的,没有一个算法是对所有情况都适合的。
这一集成体现了针对具体问题选用最适合的方法,即具体问题具体分析的哲学思想。
三、分析以下生成排列算法的正确性和时间效率:HeapPermute (n)//实现生成排列的Heap 算法//输入:一个正正整数n和一个全局数组A[1..n]//输出:A中元素的全排列if n = 1write Aelsefor i ←1 to n doHeapPermute(n-1)if n is oddswap A[1]and A[n]else s wap A[i]and A[n]解:n=1时,输出a1n=2时,输出a1a2,a2a1n=3时,(1)第一次循环i=1时,HeapPermute(2)将a1a2做完全排列输出,记为[a1a2]a3,并将A变为a2a1a3,并交换1,3位,得a3a1a2(2)第二次循环i=2时,HeapPermute(2)输出[a3a1]a2,并将A变为a1a3a2,交换1,3位,得a2a3a1(3)第三次循环i=3时,HeapPermute(2)输出[a2a3]a1,并将A变为a3a2a1,交换1,3位,得a1a2a3,即全部输出完毕后数组A回到初始顺序。
算法分析与设计教程习题解答第1章 算法引论1. 解:算法是一组有穷的规则,它规定了解决某一特定类型问题的一系列计算方法。
频率计数是指计算机执行程序中的某一条语句的执行次数。
多项式时间算法是指可用多项式函数对某算法进行计算时间限界的算法。
指数时间算法是指某算法的计算时间只能使用指数函数限界的算法。
2. 解:算法分析的目的是使算法设计者知道为完成一项任务所设计的算法的优劣,进而促使人们想方设法地设计出一些效率更高效的算法,以便达到少花钱、多办事、办好事的经济效果。
3. 解:事前分析是指求出某个算法的一个时间限界函数(它是一些有关参数的函数);事后测试指收集计算机对于某个算法的执行时间和占用空间的统计资料。
4. 解:评价一个算法应从事前分析和事后测试这两个阶段进行,事前分析主要应从时间复杂度和空间复杂度这两个维度进行分析;事后测试主要应对所评价的算法作时空性能分布图。
5. 解:①n=11; ②n=12; ③n=982; ④n=39。
第2章 递归算法与分治算法1. 解:递归算法是将归纳法的思想应用于算法设计之中,递归算法充分地利用了计算机系统内部机能,自动实现调用过程中对于相关且必要的信息的保存与恢复;分治算法是把一个问题划分为一个或多个子问题,每个子问题与原问题具有完全相同的解决思路,进而可以按照递归的思路进行求解。
2. 解:通过分治算法的一般设计步骤进行说明。
3. 解:int fibonacci(int n) {if(n<=1) return 1;return fibonacci(n-1)+fibonacci(n-2); }4. 解:void hanoi(int n,int a,int b,int c) {if(n>0) {hanoi(n-1,a,c,b); move(a,b);hanoi(n-1,c,b,a); } } 5. 解:①22*2)(−−=n n f n② )log *()(n n n f O =6. 解:算法略。
《算法分析与设计》作业(一)本课程作业由两部分组成。
第一部分为“客观题部分”,由15个选择题组成,每题1分,共15分。
第二部分为“主观题部分”,由简答题和论述题组成,共15分。
作业总分30分,将作为平时成绩记入课程总成绩。
客观题部分:一、选择题(每题1分,共15题)1、递归算法:(C )A、直接调用自身B、间接调用自身C、直接或间接调用自身D、不调用自身2、分治法的基本思想是将一个规模为n的问题分解为k个规模较小的字问题,这些子问题:(D )A、相互独立B、与原问题相同C、相互依赖D、相互独立且与原问题相同3、备忘录方法的递归方式是:(C )A、自顶向下B、自底向上C、和动态规划算法相同D、非递归的4、回溯法的求解目标是找出解空间中满足约束条件的:(A )A、所有解B、一些解C、极大解D、极小解5、贪心算法和动态规划算法共有特点是:( A )A、最优子结构B、重叠子问题C、贪心选择D、形函数6、哈夫曼编码是:(B)A、定长编码B、变长编码C、随机编码D、定长或变长编码7、多机调度的贪心策略是:(A)A、最长处理时间作业优先B、最短处理时间作业优先C、随机调度D、最优调度8、程序可以不满足如下性质:(D )A、零个或多个外部输入B、至少一个输出C、指令的确定性D、指令的有限性9、用分治法设计出的程序一般是:(A )A、递归算法B、动态规划算法C、贪心算法D、回溯法10、采用动态规划算法分解得到的子问题:( C )A、相互独立B、与原问题相同C、相互依赖D、相互独立且与原问题相同11、回溯法搜索解空间的方法是:(A )A、深度优先B、广度优先C、最小耗费优先D、随机搜索12、拉斯维加斯算法的一个显著特征是它所做的随机选性决策有可能导致算法:( C )A、所需时间变化B、一定找到解C、找不到所需的解D、性能变差13、贪心算法能得到:(C )A、全局最优解B、0-1背包问题的解C、背包问题的解D、无解14、能求解单源最短路径问题的算法是:(A )A、分支限界法B、动态规划C、线形规划D、蒙特卡罗算法15、快速排序算法和线性时间选择算法的随机化版本是:( A )A、舍伍德算法B、蒙特卡罗算法C、拉斯维加斯算法D、数值随机化算法主观题部分:二、写出下列程序的答案(每题2.5分,共2题)1、请写出批处理作业调度的回溯算法。
1.简述算法和程序的区别。
算法:是指解决问题的一种方法或一个过程。
算法是若干指令的有穷序列,程序:是算法用某种程序设计语言的具体实现。
程序可以不满足算法的性质(4)。
例如:操作系统,是一个在无限循环中执行的程序,因而不是一个算法。
操作系统的各种任务可看成是单独的问题,每一个问题由操作系统中的一个子程序通过特定的算法来实现。
该子程序得到输出结果后便终止。
2.一个算法应有哪些主要特征?满足如下性质:(1)输入:有外部提供的量作为算法的输入。
(2)输出:算法产生至少一个量作为输出。
(3)确定性:组成算法的每条指令是清晰,无歧义的。
(4)有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的。
3.简述动态规划算法和贪心算法的基本要素。
动态规划算法的基本要素:最优子结构:矩阵连乘计算次序问题的最优解包含着其子问题的最优解。
这种性质称为最优子结构性质。
在分析问题的最优子结构性质时,所用的方法具有普遍性:首先假设由问题的最优解导出的子问题的解不是最优的,然后再设法说明在这个假设下可构造出比原问题最优解更好的解,从而导致矛盾。
利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解。
最优子结构是问题能用动态规划算法求解的前提。
重叠子问题:递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。
这种性质称为子问题的重叠性质。
动态规划算法,对每一个子问题只解一次,而后将其解保存在一个表格中,当再次需要解此子问题时,只是简单地用常数时间查看一下结果。
通常不同的子问题个数随问题的大小呈多项式增长。
因此用动态规划算法只需要多项式时间,从而获得较高的解题效率贪心算法的基本要素:贪心选择性质:所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。
这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。
动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。
东北大学继续教育学院算法设计与分析(一)复习题一、选择题1.算法的复杂性是()的度量,是评价算法优劣的重要依据。
A.时间效率B.算法效率C.空间效率D.输出效率2.衡量一个算法好坏的标准是()。
A.运行速度快B.占用空间少C.时间复杂度低D.代码短3.算法分析的两个主要方面是()。
A.空间复杂度和时间复杂度B.正确性和简单性C.可读性D.程序复杂度4.计算机算法指的是()。
A.计算方法B.排序方法C.解决问题的方法和过程D.调度方法5.多阶段决策问题就是要在可以选择的那些策略中间选取一个()策略使在预定的标准下达到最好的效果。
A.最优B.最差C.平衡D.任意6.下列关于算法的说法中正确的有()个。
(1)求解某一类问题的算法是唯一的;(2)算法必须在有限步操作后停止;(3)算法的每一步操作是明确的,不能有歧义或含义模糊;(4)算法执行后一定产生确定的结果。
7.( )是指算法执行时所需计算机资源的多少,包括运行时间和存储空间两个方面的要求。
A.正确性B.可读性C.效率D.健壮性8.对于简单的输入,输出和赋值语句,执行时间为()。
(1) (n) (n*n) D.都不对9.算法点的空间复杂度是指()。
A.算法在执行过程中所需的计算机存储空间B.算法所处理的数据量C.算法程序中的语句或指令的条数D.算法在执行过程中所需要的临时工作单元数10.算法点的时间复杂度是指()。
A.算法的执行时间B.算法所处理的数据量C.算法程序中的语句或指令的条数D.算法在执行过程中所需要的基本运算次数11.下列哪一种算法不是随机化算法()。
A.遗传算法B.模拟退火算法C.动态规划算法D.模特卡罗算法12.下面不是动态规划算法基本步骤的是()。
A.找出最优解的性质B.构造最优解C.算出最优解D.定义最优解13.下列是动态规划算法基本要素的是()。
A.定义最优解B.构造最优解C.算出最优解D.子问题重叠性质14.采用广度优先策略搜索的算法是()。
《算法分析与设计》
课程设计报告
学院(系):软件工程系
班级:2
学生姓名:邹军学号
指导教师:
时间:从2015年1月12 日到2014年1月16日
目录
基因序列比较问题 (1)
棋盘覆盖问题 (6)
题目一基因序列比较问题
1. 问题描述:人类基因由4种核苷酸,分别用字母ACTG表示。
随意给出两个基因序列,比如:AGTGATG和GTTAG,它们有多相似呢?测量两个基因的相似度一种方法称为对齐。
使用对齐方法可以在基因的适当位置加入空格,让两个基因的长度相等,然后根据基因的分值矩阵计算分数。
2.解决问题所用的方法及基本思路:关于基因序列问题,采用了动态规划思想,即将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
关键是找出两个基因序列的最长公共子序列,利用LCS算法可以找出任意两个序列的最长公共子序列,然后采用补齐的方式,将两个基因序列对齐,并将两
个序列相同的部分对应到指定的位置,空出来的地方填写相应的标识符。
LCS算法设序列X={x1,x2,x3.......x m}和Y={y1,y2,y3........y n}的一个最长公共子序列Z={z1,z2,z3......z k},则有
(1)若x m=y n,z k=x m=y n,且Z k-1是X m-1和Y n-1的最长公共子序列;
(2)若x m≠y n,且z k≠x m,则Z是X m-1和Y的最长公共子序列;
(3)若x m≠y n,且z k≠y n,则Z是X和Y n-1的最长公共子序列。
X m-1={x1,x2....xm-1},Y n-1={y1,y2.....yn-1},Z k-1={z1,z2....zk-1} 3. 采用的数据结构描述:
(2)ArrayList链表结构
为了便于后期数据的处理,将输入的两组基因序列分别放入两个不同的链表中,
(3)数组
本程序中,数组作为中间临时存储的空间
(4)String字符串类型
4.算法描述:
算法名称:基因序列比较
输入:任意两组基因序列
输出:基因相似度分值分数
算法实现细节(可以用流程图,伪代码)
public static int[][] lcslength(String fo[], String fs[]) { 通过LCS算法计算出两序列的长度数组C[][],并返回
}
public static int lcs(int l, int s, int fb[][], String[] fo) {
由C[][]数组找出相同的基因,并调用相应的分值计算方法
}
public static int grade(m,n){
通过传递过来的字母m,n找出分值并返回
}
5.算法的时间空间复杂度分析
(1)时间复杂度分析
基因序列问题,花费的时间主要集中在填写用于记录的二维数组表。
其中填写数组时,用到四个循环,因此,时间复杂度为O(m4)(m 的取值与基因序列长度有关)
(2)空间复杂度分析
基因序列题目中,存储二维数组int[][],假定数组长度为m,n(m,n 实际取值视输入字符串以及最终对齐后的长度决定),则该题目的空间复杂度为O(m*n).
6.算法实例:
数据的输入
数据的输出
题目二棋盘覆盖问题
1. 问题描述:在一个(k≥0)个方格组成的棋盘中,恰有一
个方格与其他方格不同,称该方格为特殊方格。
显然,特殊方格在棋盘中可能出现的位置有种,因而有4k种不同的棋盘,图a所示是k=2时16种棋盘中的一个。
棋盘覆盖问题(chess cover problem)要求用图 (b)所示的4种不同形状的L型骨牌覆盖给定棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
2. 解决问题所用的方法及基本思路:针对棋盘覆盖问题,采用分治策略进行解答。
分治策略的基本步骤如下:(1)分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题。
(2)解决:若子问题规模较小而容易被解决则直接解决,否则递归地解决各个子问题。
(3)合并:将各个子问题的解合并为原问题的解。
关于棋盘覆盖问题,就是利用这三个步骤,首先根据特殊方格所在的位置,将整个棋盘进行划分,并在切分过后的交界处,进行L型骨牌覆盖。
如此,每一块切分的区域都含有一块特殊方格,然后递归调用之前的做法,直到每一块区域全部覆盖为止。
3. 采用的数据结构描述:
(1)数组
本程序中,数组作为存储的空间
4.算法描述:
算法名称:棋盘覆盖问题
输入:任意输入棋盘规格,特殊方格的横、纵坐标
输出:覆盖后的棋盘
算法实现细节(可以用流程图,伪代码)
public void ChessBoard(int tr,int tc,int dr,int dc,int size){ Int t=title++;
Int s=size/2;
//覆盖左上角子棋盘
If(dr<s并且dc<s)
递归调用ChessBoard
Else
覆盖棋盘(tr+s-1,tc+s-1)的位置
递归调用ChessBoard
//覆盖右上角子棋盘
If(dr<s并且dc>s)
递归调用ChessBoard
Else
覆盖棋盘(tr+s-1,tc+s)的位置
递归调用ChessBoard
//覆盖左下角子棋盘
If(dr>s并且dc<s)
递归调用ChessBoard
Else
覆盖棋盘(tr+s,tc+s-1)的位置
递归调用ChessBoard
//覆盖右下角子棋盘
If(dr>s并且dc>s)
递归调用ChessBoard
Else
覆盖棋盘(tr+s,tc+s)的位置
递归调用ChessBoard
}
6.算法的时间空间复杂度分析
(1)时间复杂度
棋盘覆盖题目中,时间花费主要集中于覆盖时的递归调用。
因此,时间复杂度为O(nlog8n)+4O(1)
(2)空间复杂度
空间的花费并不是太大,主要集中在存储覆盖后的二维数组,故空间复杂度为O(m*n)(m与n取决于输入棋盘的规模大小)
6.算法实例:
数据的输入
数据的输出
课程设计总结。