算法导论小作业

发布 2022-08-27 15:54:28 阅读 4824

第2次作业。

第一题:1.给定两个字符串x=x1x2…xn和y=y1y2…ym,其长度为k的公共子串定义为x[i,…,i+k-1]=y[j, …j+k-1],令kmax为x和y的最长公共子串,设计时间复杂性为o(mn)的算法求kmax。

考虑最长公共子序列问题如何分解成子问题,设a=“a0,a1,,am-1”,b=“b0,b1,,bm-1”,并z=“z0,z1,,zk-1”为它们的最长公共子序列。不难证明有以下性质:(1)如果am-1=bn-1,则zk-1=am-1=bn-1,且“z0,z1,,zk-2”是“a0,a1,,am-2”和“b0,b1,,bn-2”的一个最长公共子序列;

2)如果am-1!=bn-1,则若zk-1!=am-1,蕴涵“z0,z1,,zk-1”是“a0,a1,,am-2”和“b0,b1,,bn-1”的一个最长公共子序列;

3)如果am-1!=bn-1,则若zk-1!=bn-1,蕴涵“z0,z1,,zk-1”是“a0,a1,,am-1”和“b0,b1,,bn-2”的一个最长公共子序列。

这样,在找a和b的公共子序列时,如有am-1=bn-1,则进一步解决一个子问题,找“a0,a1,,am-2”和“b0,b1,,bm-2”的一个最长公共子序列;如果am-1!=bn-1,则要解决两个子问题,找出“a0,a1,,am-2”和“b0,b1,,bn-1”的一个最长公共子序列和找出“a0,a1,,am-1”和“b0,b1,,bn-2”的一个最长公共子序列,再取两者中较长者作为a和b的最长公共子序列。

为了节约重复求相同子问题的时间,引入一个数组,不管它们是否对最终解有用,把所有子问题的解存于该数组中,这就是动态规划法所采用的基本方法,具体说明如下。

定义c[i][j]为序列“a0,a1,,ai-2”和“b0,b1,,bj-1”的最长公共子序列的长度,计算c[i][j]可递归地表述如下:(1)c[i][j] =0如果i=0或j=0;

2)c[i][j] =c[i-1][j-1]+1如果i,j>0,且a[i-1] =b[j-1];

3)c[i][j] =max如果i,j>0,且a[i-1] !b[j-1]。按此算式可写出计算两个序列的最长公共子序列的长度函数。

由于c[i][j]的产生仅依赖于c[i-1][j-1]、c[i-1][j]和c[i][j-1],故可以从c[m][n]开始,跟踪c[i][j]的产生过程,逆向构造出最长公共子序列。细节见程序。#include <>#include <>

#define n 100

char a[n], b[n], str[n];int c[n][n];

int lcs_len(char* a, char* b, int c[n])}

return c[m][n];}

char* build_lcs(char s,char* a, char* b)}

return s;}

void main()}

matrixchain(inputnum,2*n-1,m,0);/计算最小得分intresultmin=m[0][n-1];for(i=1;i<=n-1;i++)

if(resultmin>m[i][n-1+i])resultmin=m[i][n-1+i];

matrixchain(inputnum,2*n-1,m,1);/计算最大得分intresultmax=m[0][n-1];for(i=1;i<=n-1;i++)if(resultmax第3题,第4题解法相同。

第一次作业。

1)由主定理,知,a=3,b=2,f(n)=n;n^log2(3)比f(n)=n高阶,所以t(n)=θn^log2(3))。

2)a=2,b=2,n^log2(2)=n,f(n)=n*logn比n^log2(2)高阶,但不是多项式的大于,主定理不适用于本递归式。而f(n)=θn^logb(a)*(lgn)^k),其中a=2,b=2,k=1,则t(n)=θn^logb(a)*(lgn)^(k+1))=n*(lgn)^2)。

3)h(n) =h(n/2) +h(n/4) +h(n/6) +h(n/12) +n

画出递归树,知道从根到叶子的最长路径是n→n/2→n/4→n/8→→1。而树的深度是log2(n).而每层的总代价是n(前面大部分层),故我们猜测复杂度是o(nlgn).

所以,只要证明t(n)=o(nlgn)<=d*nlgn即可证实猜想。t(n)= h(n/2) +h(n/4) +h(n/6) +h(n/12) +n<=d*(n/2)lg(n/2)+d*(n/4)lg(n/4)+d*(n/6)lg(n/6)+d*(n/12)lg(n/12)+n=d*nlgn-d*n(13/12+1/4*lg3)<=d*nlgn得证。

4)g(n) =g(n1) +1/n=g(n2)+1/(n-1) +1/n =g(n3)+1/(n-2)+1/(n-1) +1/n

g(n4)+1/(n-3)+1/(n-2)+1/(n-1) +1/n=

2.采用二分法实现:二分法的时间复杂度是mlgn,而这里只有两个数组所以m=2;即lgm+lgn

public void merge(int m,int n)else}3.

1)对等式进行变形,则a*n*n<=2^(lgn+lgn)<=b*n*n,只要存在a,b使得不等式成立,则结论正确;再对不等式同时取对数,则2algn<=lg2*(lgn+lgn)<=2blgn

当n=2^k时,lgn+lgn=2k,则上式变成a<=lg2<=b,故a,b显然存在。

当n=2^k+m时,lgn+lgn=2k+1,则上式变成2a(k+x)<=lg2(2k+1)<=2b(k+x),其中。

g(1)+1/2+1/3+1/4+1/n=1++1/2+1/3+1/4+1/n<=lgn+1=o(lgn)

0当n=2^k时,则lgn的上界下界均等于k,要证明猜想,只要证明2^k=θ(2^k),n=θ(n)即显然成立;

当n=2^k+m时,则lgn的上界是k+1,下界是k,要证明猜想,只要证明2^k=θ(2^(k+1)),即证a*2^(k+1)<=2^k<=b*2^(k+1)即证2a<=1<=2b,显然只要a<=1/2<=b,猜想成立。4.

1)该算法的主要思想是分段排序,先对前面2/3的数进行排序,返回这2/3数据的有序数列;然后对整个数据的后面2/3数据进行排序,确定最大的1/3数据(有序),返回有序数列;最后再对发生变化的前面2/3的数据进行排序,返回这部分有序数列,这样一来,整个数列就呈现有序排列了。而具体实现中,利用递归调用,不断的分段处理,直到排列数只有2个的时候,停止递归调用,将这两个数按从小到大排序,向下执行,(前面一步的调用存在3个数)对后2个数进行排序,再向下执行,对变化后的前2个数进行排序,这样,这3个数就排好序了,之后返回上一级,继续向下执行,直到程序结束,数据就排好序了。

其余未作题目不懂。(不过会争取懂)

生物技术导论小作业

06120801班。申文伊 20081899 酶工程应用举例以及酶工程生物柴油领域的发展现状。1 酶工程的应用。酶作为一种生物催化剂,已广泛地应用于轻工业的各个生产领域。近几十年来,随着酶工程不断的技术性突破,在工业 农业 医药卫生 能源开发及环境工程等方面的应用越来越广泛。食品加工中的应用。酶在食...

作业调度算法 先来先服务算法,短作业算法

操作系统 实验报告。题目 作业调度算法。班级 网络工程。姓名 朱锦涛。学号 e31314037 一 实验目的。用 实现页面调度算法,即先来先服务 fcfs 调度算法。短作业优先算法 高响应比优先调度算法。通过 的具体实现,加深对算法的核心的理解。二 实验原理。1.先来先服务 fcfs 调度算法。fc...

作业调度算法 先来先服务算法,短作业算法

操作系统 实验报告。题目 作业调度算法。班级 网络工程。姓名 朱锦涛。学号 e31314037 一 实验目的。用 实现页面调度算法,即先来先服务 fcfs 调度算法。短作业优先算法 高响应比优先调度算法。通过 的具体实现,加深对算法的核心的理解。二 实验原理。1.先来先服务 fcfs 调度算法。fc...