当前位置:文档之家› 最长公共子序列实验报告

最长公共子序列实验报告

最长公共子序列实验报告
最长公共子序列实验报告

最长公共子序列问题

一.实验目的:

1.加深对最长公共子序列问题算法的理解,实现最长公共子序列问题的求解算法;

2.通过本次试验掌握将算法转换为上机操作;

3.加深对动态规划思想的理解,并利用其解决生活中的问题。

二.实验内容:

1.编写算法:实现两个字符串的最长公共子序列的求解;

2.将输入与输出数据保存在文件之中,包括运行时间和运行结果;

3.对实验结果进行分析。

三.实验操作:

1.最长公共子序列求解:

将两个字符串放到两个字符型数组中,characterString1和characterString2,当characterString1[m]= characterString2[m]时,找出这两个字符串m之前的最长公共子序列,然后在其尾部加上characterString1[m],即可得到最长公共子序列。当characterString1[m] ≠characterString2[m]时,需要解决两个子问题:即找出characterString1(m-1)和characterString2的一个最长公共子序列及characterString1和characterString2(m-1)的一个最长公共子序列,这两个公共子序列中较长者即为characterString1和characterString2的一个最长公共子序列。

2.动态规划算法的思想求解:

动态规划算法是自底向上的计算最优值。

计算最长公共子序列长度的动态规划算法LCS-Length以characterString1和characterString2作为输入,输出两个数组result和judge1,其中result存储最长公共子序列的长度,judge1记录指示result的值是由那个子问题解答得到的,最后将最终的最长公共子序列的长度记录到result中。

以LCS-Length计算得到的数组judge1可用于快速构造序列最长公共子序列。首先从judge1的最后开始,对judge1进行配对。当遇到“↖”时,表示最长公共子序列是由characterString1(i-1)和characterString2(j-1)的最长公共子序列在尾部加上characterString1(i)得到的子序列;当遇到“↑”时,表示最长公共子序列和characterString1(i-1)与characterString2(j)的最长公共子序列相同;当遇到“←”时,表示最长公共子序列和characterString1(i)与characterString2(j-1)的最长公共子序列相同。

如图所示:

时间复杂度公式:

代码实现:

void LCSLength(char* characterString1,char*

characterString2,int length1,int length2,int judge[][10000]){ int result[100][100];

for(int i=0;i<=length1;i++) result[i][0]=0;

for(int j=1;j<=length2;j++) result[0][j] = 0;

for(int i=1;i<=length1;i++){

for(int j=1;j<=length2;j++){

if(characterString1[i-1]==characterString2[j-1]){

result[i][j]=result[i-1][j-1]+1;

judge[i][j]=0;

}

else if(result[i-1][j]>=result[i][j-1]){

result[i][j]=result[i-1][j];

judge[i][j]=1;

}

else{

result[i][j]=result[i][j-1];

judge[i][j]=-1;

}

}

}

}

void LCS(int judge[][10000],char* characterString1,int

length1,int length2){//得到最长公共子序列

if(length1==0||length2==0) return;

if(judge[length1][length2]==0){

LCS(judge,characterString1,length1-1,length2-1);

record(characterString1[length1-1]);//存入文件

cout<

}

else if(judge[length1][length2]==1)

LCS(judge,characterString1,length1-1,length2);

else LCS(judge,characterString1,length1,length2-1);

}

3.备忘录算法实现:

备忘录算法是从顶向下计算最优解的思想,备忘录方法的控制结构与直接递归方法的控制结构相同,但备忘录方法用一个表格来保存已解决的子问题的答案,避免了相同问题的重复求解。

代码实现:

int searchLCS(char* characterString1,char* characterString2,int length1,int length2){

if(judge2[length1][length2]>-1) return

judge2[length1][length2];

if(length1==0||length2==0) judge2[length1][length2]=0;

else{

if(characterString1[length1-1]==characterString2[length2-1])

judge2[length1][length2]=searchLCS(characterString1,charact

erString2,length1-1,length2-1)+1;

else

judge2[length1][length2]=max(searchLCS(characterString1,cha

racterString2,length1,length2-1),

searchLCS(characterString1,characterString2,length1-1,lengt

h2));

}

return judge2[length1][length2];

}

int memorizedLCS(char* characterString1,char* characterString2){ int length1=strlen(characterString1);

int length2=strlen(characterString2);

for(int i=1;i<=length1;i++)

for(int j=1;j<=length2;j++)

judge2[i][j]=-1;

return

searchLCS(characterString1,characterString1,length1,length2);

}

4.递归法:

设有字符串characterString1和characterString2,当两个数组的对应位置的字

符相同时,则直接求解下一个位置,当不同时取两种情况中的最大值。

时间复杂度公式:

代码实现:

int recursionLCS(int i,int j,int length1){

if(i>=length1||j>=length2) return 0;

if(characterString1[i]==characterString2[j]) return 1+recursionLCS(i+1,j+1);

else return

recursionLCS(i+1,j)>recursionLCS(i,j+1)?recursionLCS(i+1,j)

:recursionLCS(i,j+1);

}

5.穷举法:

将数组characterString1和characterString2两个字符串的所有字串求出,并将这些字串相互比较,直到找的最长公共子序列为止,当字符串的长度很长时,所要求取的子串序列相当多,故所开销的时间最多。

四.实验结果分析:

当输入字符串长度分别为(20,20),(34,78),(98,145)时,在动态规划算法、备忘录算法、递归算法得到的时间分别为(0,0,0),(0,16,22),(0,16,34),由于在多次测量下不稳定,故不做具体展示。

得到上述情况是由于生成的字符串具有不确定性,以及代码的不完善,不能对大数据进行时间测量。

五.实验感受:

本次实验对字符串的反复递归,对栈的操作经常发生访问冲突的错误,故只能才用少量的数据处理,并且当数据存放到文件中时,子函数和主函数对同一文件的操作有覆盖和不显示的问题,故创建了两个文本文件用于对实验结果的存放。

多元时间序列建模分析

应用时间序列分析实验报告

单位根检验输出结果如下:序列x的单位根检验结果:

1967 58.8 53.4 1968 57.6 50.9 1969 59.8 47.2 1970 56.8 56.1 1971 68.5 52.4 1972 82.9 64.0 1973 116.9 103.6 1974 139.4 152.8 1975 143.0 147.4 1976 134.8 129.3 1977 139.7 132.8 1978 167.6 187.4 1979 211.7 242.9 1980 271.2 298.8 1981 367.6 367.7 1982 413.8 357.5 1983 438.3 421.8 1984 580.5 620.5 1985 808.9 1257.8 1986 1082.1 1498.3 1987 1470.0 1614.2 1988 1766.7 2055.1 1989 1956.0 2199.9 1990 2985.8 2574.3 1991 3827.1 3398.7 1992 4676.3 4443.3 1993 5284.8 5986.2 1994 10421.8 9960.1 1995 12451.8 11048.1 1996 12576.4 11557.4 1997 15160.7 11806.5 1998 15223.6 11626.1 1999 16159.8 13736.5 2000 20634.4 18638.8 2001 22024.4 20159.2 2002 26947.9 24430.3 2003 36287.9 34195.6 2004 49103.3 46435.8 2005 62648.1 54273.7 2006 77594.6 63376.9 2007 93455.6 73284.6 2008 100394.9 79526.5 run; proc gplot; plot x*t=1 y*t=2/overlay; symbol1c=black i=join v=none; symbol2c=red i=join v=none w=2l=2; run; proc arima data=example6_4; identify var=x stationarity=(adf=1); identify var=y stationarity=(adf=1); run; proc arima; identify var=y crrosscorr=x; estimate methed=ml input=x plot; forecast lead=0id=t out=out; proc aima data=out; identify varresidual stationarity=(adf=2); run;

最长公共子序列问题(最)

算法作业: LCS 问 题 作业要求:设计一个算法求出两个序列的所有LCS ,分析最坏情况,用“会计方法”证明利用b[i][j]求出 所有LCS 的算法在最坏情况下时间复杂度为)(m m n C O + 1、 算法思路: 根据最长公共子序列问题的性质,即经过分解后的子问题具有高度重复性,并且具有最优子结构性质,采用动态规划法求解问题。设X={x 1, x 2, … , x n }, Y={y 1, y 2, … , y m }, 首先引入二维数组C[i][j]记录X i 和Y j 的LCS 的长度,定义C[i][j]如下: { j i j y i 且x ,i,j ]][j C[i j y i x j i j i C j i C j i C 00001110,]},1][[],][1[max{]][[===>+--≠>--=或,且 为了构造出LCS ,还需要使用一个二维数组b[m][n],b[i][j]记录C[i][j]是通过哪个子问题的值求得 的,以决定搜索的方向,欲求出所有的LCS ,定义数组b 如下: 设1-对角线方向;2-向上;3-向左;4-向上或向左 若X[i]=Y[j],b[i][j] = 1, 若C[i-1][j][i][j-1], 则b[i][j] = 3, 若C[i-1][j]=[i][j-1], 则b[i][j] = 4, 根据以上辅助数组C 和b 的定义,算法首先需要求出这两个数组, C[m][n]中记录的最长公共子序列的长度,b 中记录了查找子序列元素的搜索方向。 利用C 和b 的信息,Find_All_LCS 可以采用回溯法求出所有的LCS 。基本思路如下:使用一个辅助数组记录每次调用Find_All_LCS 得到的LCS 中的元素,每次递归调用一次Find_All_LCS ,进入一个新的执行层,首先要判断当前处理的两个子序列长度是否大于等于0 ,若不满足,则该层的递归结束,返回上一层;然后再判断当前得到的子序列是否等于数组C 中求出的最长公共子序列长度,若等于,则说明算法执行到此已经得到一个LCS ,按序输出;若不等于,此时根据数组b 中记录的搜索方向继续搜索,特别要说明的是,当b[i][j]=4时,即要向上或向左,需要对这两个方向分别调用Find_All_LCS ,保证沿着这两个方向上LCS 元素不被漏掉,都可以搜索到;若b[i][j]=1,即沿对角线方向搜索前进时,此时元素X[i]为LCS 中的元素,存放至辅助数组中去,同时将当前已经求得的LCS 长度增1,当递归调用Find_All_LCS 从b[i][j]=1处时,需要回溯一步,搜索其它路径上可能为LCS 中的元素。当所有的可能路径都已经搜索完,算法结束。 对于某些情况会输出重复的LCS ,这是因为算法在沿不同路径搜索时可能会出现相同的LCS 序列。 2、 时间复杂度分析 由上述对Find_All_LCS 算法的分析可知,求出所有的LCS 实际上是根据搜索的方向信息遍历所有的路径找出满足条件的元素集合。因此,除求解辅助数组C 和b 所用的O(mn+m+n)的执行时间外,Find_All_LCS 的时间复杂度取决于所遍历路径数。而路径数是由搜索方向决定的。显然算法在最好的情况下,即m=n 并且b 中所有的值都指示沿着对角线方向搜索,时间复杂度为O(n). 相反,当X 和Y 序列不存在公共子序列时为算法的最坏情况,此时C 中所有值都等于0,数组b 中所有的值都指示要分别沿两个不同的方向(向左或向上)搜索,这种情况下每处理一次X[i],Y[j]时总是要沿两个方向分别调用Find_All_LCS ,遇到i=0或j=0时返回,直到搜索完所有的可能路径才结束,最坏情况下的搜索矩阵如下图所示:

求最长子序列的长度

一,最长递增子序列问题的描述 设L=是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=,其中k1是对序列L=按递增排好序的序列。那么显然X与L的最长公共子序列即为L的最长递增子序列。这样就把求最长递增子序列的问题转化为求最长公共子序列问题LCS了。 最长公共子序列问题用动态规划的算法可解。设Li=< a1,a2,…,a i>,Xj=< b1,b2,…,b j>,它们分别为L和X的子序列。令C[i,j]为Li与Xj的最长公共子序列的长度。则有如下的递推方程: 这可以用时间复杂度为O(n2)的算法求解,由于这个算法上课时讲过,所以具体代码在此略去。求最长递增子序列的算法时间复杂度由排序所用的O(nlogn)的时间加上求LCS的O(n2)的时间,算法的最坏时间复杂度为O(nlogn)+O(n2)=O(n2)。 三,第二种算法:动态规划法 设f(i)表示L中以a i为末元素的最长递增子序列的长度。则有如下的递推方程: 这个递推方程的意思是,在求以a i为末元素的最长递增子序列时,找到所有序号在L前面且小于a i的元素a j,即j

时间序列分析实验报告(3)

《时间序列分析》课程实验报告

一、上机练习(P124) 1.拟合线性趋势 12.79 14.02 12.92 18.27 21.22 18.81 25.73 26.27 26.75 28.73 31.71 33.95 程序: data xiti1; input x@@; t=_n_; cards; 12.79 14.02 12.92 18.27 21.22 18.81 25.73 26.27 26.75 28.73 31.71 33.95 ; proc gplot data=xiti1; plot x*t; symbol c=red v=star i=join; run; proc autoreg data=xiti1; model x=t; output predicted=xhat out=out; run; proc gplot data=out; plot x*t=1 xhat*t=2/overlay; symbol2c=green v=star i=join; run; 运行结果:

分析:上图为该序列的时序图,可以看出其具有明显的线性递增趋势,故使用线性模型进行拟合:x t=a+bt+I t,t=1,2,3,…,12 分析:上图为拟合模型的参数估计值,其中a=9.7086,b=1.9829,它们的检验P值均小于0.0001,即小于显著性水平0.05,拒绝原假设,故其参数均显著。从而所拟合模型为:x t=9.7086+1.9829t.

分析:上图中绿色的线段为线性趋势拟合线,可以看出其与原数据基本吻合。 2.拟合非线性趋势 1.85 7.48 14.29 23.02 37.42 74.27 140.72 265.81 528.23 1040.27 2064.25 4113.73 8212.21 16405.95 程序: data xiti2; input x@@; t=_n_; cards; 1.85 7.48 14.29 23.02 37.42 74.27 140.72 265.81 528.23 1040.27 2064.25 4113.73 8212.21 16405.95 ; proc gplot data=xiti2; plot x*t; symbol c=red v=star i=none; run; proc nlin method=gauss; model x=a*b**t; parameters a=0.1 b=1.1; der.a=b**t; der.b=a*t*b**(t-1); output predicted=xh out=out; run; proc gplot data=out; plot x*t=1 xh*t=2/overlay;

(完整word版)最长公共子序列长度算法

// KSY.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include using namespace std; void LCSLength(int m,int n,char *x ,char *y, int **c, int **b) { int i ,j; for (i = 1; i <= m; i++) c[i][0] = 0; for (i = 1; i <= n; i++) c[0][i] = 0; for (i = 1; i <= m; i++) for (j = 1; j <= n; j++) {

if (x[i]==y[j]) { c[i][j]=c[i-1][j-1]+1; b[i][j]=1; } else if (c[i-1][j]>=c[i][j-1]) { c[i][j]=c[i-1][j]; b[i][j]=2; } else { c[i][j]=c[i][j-1]; b[i][j]=3; } } } void LCS(int i ,int j, char *x ,int **b) { if (i ==0 || j==0) return; if (b[i][j]== 1) { LCS(i-1,j-1,x,b); printf("%c",x[i]); } else if (b[i][j]== 2) LCS(i-1,j,x,b); else LCS(i,j-1,x,b); } const int M = 6; const int N = 5; void output(char *s,int n); void LCSLength(int m,int n,char *x,char *y,int * *c,int * *b); void LCS(int i,int j,char *x,int * *b); void main() { char x[] = {' ','B','C','E','F','G','T'}; char y[] = {' ','C','D','F','J','G'}; int **c = new int *[M+1]; int **b = new int *[M+1]; for(int i=0;i<=M;i++) { c[i] = new int[N+1]; b[i] = new int[N+1]; } cout<<"序列X:"<

时间序列分析实验报告

时间序列分析实验报告 P185#1、某股票连续若干天的收盘价如表5-4 (行数据)所示。 表5-4 304 303 307 299 296 293301 293 301 295 284286 286 287 284 282278 281 278 277279 278 270 268 272 273 279 279280 275 271 277 278279 283 284 282 283279 280 280 279278 283 278 270 275 273 273 272275 273 273 272 273272 273 271 272 271273 277 274 274272 280 282 292 295 295 294 290 291 288 288 290 293 288 289 291 293 293 290 288 287 289 292 288 288 285 282 286 286 287 284 283 286 282 287 286 287 292 292 294 291 288 289 选择适当模型拟合该序列的发展,并估计下一天的收盘价。 解: (1)通过SA漱件画出上述序列的时序图如下: 程序: data example5_1; in put x@@; time=_ n_; cards ; 304 303 307 299296 293 301 293 301 295 284286286 287 284 282 278 281 278277 279 278 270 268 272 273279279 280 275 271 277 278 279283 284 282 283 279 280 280279278 283 278 270 275 273 273272 275 273 273 272 273 272273271 272 271 273 277 274 274272 280 282 292 295 295 294290291 288 288 290 293 288 289291 293 293 290 288 287 289292288 288 285 282 286 286 287284 283 286 282 287 286 287292292 294 291 288 289 proc gplot data =example5_1; plot x*time= 1; symbol1 c=black v=star i =join; run ; 上述程序所得时序图如下: 上述时序图显示,该序列具有长期趋势又含有一定的周期性,为典型的非平稳序列。又因为该序列呈现曲线形式,所以选择2阶差分。

最长公共子序列实验报告

河北地质大学课程设计报告 (学院)系: 信息工程学院 专业: 计算机科学与技术 姓名: 李义 班级: 二班 学号: 515109030227 指导教师: 王培崇 2016年11月26 日

算法课程设计报告 姓名李义学号515109030227 日期2016/11/10-2016/12/1 实验室152 指导教师王培崇设备编号08 设计题目求最长公共子序列 一、设计内容 求最长公共子序列,如输入字符串str1=adadsda,str2=sadasfda。 则求出的最长公共子序列是adasda。 二、设计目的 掌握动态规划思想,对使用求最长公共子序列加深理解。 三、设计过程 1.算法设计 1. for i ←0 to n 2. L[i,0] ←0 3. end for 4. for j ←0 to m 5. L[0,j] ←0 6. end for 7. for i ←1 to n 8. for j ←1 to m 9. if ai=bj then L[i,j]←L[i-1,j-1]+1 10. else L[i,j]←max {L[i,j-1], L[i-1,j] } 11. end if 12. end for 13. end for 14. return L[n,m] 2.流程图

开始结束 输入I=0,j=0 i<=n L[I,0]=0 i++ Y L[0,j]=0 N j<=n j++ Y i=1 to n J=1 to m ai=bj L[i,j]=L[i-1,j-1]+1 L[i,j]=max{L[i-1,j ],L[i,j-1]} Y J++i++ N 图1.Lcs 算法 3.数据结构 str1=adadsda str2=sadasfda 四、程序实现及运行结果

动态规划解最长公共子序列问题

动态规划解最长公共子序列问题 动态规划主要针对最优化问题,它的决策是全面考虑不同的情况分别进行决策,,最后通过多阶段决策逐步找出问题的最终解.当各个阶段采取决策后,会不断决策出新的数据,直到找到最优解.每次决策依赖于当前状态,又随机引起状态的转移.一个决策序列就是在变化的状态中产生出来的,故有”动态”的含义.所以,这种多阶段最优化决策解决问题的过程称为动态规划. 一问题的描述与分析 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干字符(可能一个也不去掉)后形成的字符序列..令给定的字符序列X=”x0,x1,x2,…xm-1”,序列Y=”y0,y1,…yk-1”是X的子序列,存在X的一个严格递增下标序列i=i0,i1,i2,…ik-1,使得对所有的j=0,1,2,…k-1,有xi=yi。例如X=“ABCBDAB”,Y=“BCDB”是X的一个子序列。 给定两个序列A和B,称序列Z是A和B公共子序列,是指Z同是A和B的子序列。求最长公共子序列。 若A的长度为m,B的长度为n,则A的子序列有2*m-1个,B的子序列有2*n-1个。采用枚举法分别对A和B的所以子序列一一检查,最终求出最长公共子序列。如此比较次数(2*2n)接近指数阶,当n较大时,算法太耗时,不可取。所以要全面考虑不同的情况分别进行决策,,最后通过多阶段决策逐步找出问题的最终解.当各个阶段采取决策后,会不断决策出新的数据,直到找到最优解。 二、算法设计(或算法步骤) A=”a0,a1,a2,……am-1”,B=”b0,b1,b2,……bn-1”,且Z=”z0,z1,z2……zk-1”,为她们的最长公共子序列。不难证明有一下结论: (1)如果am-1=bn-1,则zk-1=am-1=bn-1,且“z0,z1,z2,……zk-2”是“a0,a1,a2,…… am-2”和“b0,b1,b2,……bn-2”的一个最长公共子序列; (2)如果am-1!=bn-1,则若zk-1!=am-1,则“z0,z1,z2,……zk-1”是“a0,a1,a2,…… am-2”和”b0,b1,b2,……bn-1”的一个最长公共子序列。 (3)如果am-1!=bn-1,则若zk-1!=bn-1,则“z0,z1,z2,……zk-1”是“a0,a1,a2,…… am-1”和“b0,b1,b2,……bn-2”的一个最长公共子序列。 如此找到了原问题与其子问题的递归关系。 基本存储结构是存储两个字符串及其最长公共子序列的3个一位数组。当然要找出最长公共子序列,要存储当前最长公共子序列的长度和当前公共子序列的长度,而若只存储当前信息,最后只能求解最长公共子序列的长度,却不能找到最长公共子序列本身。因此需建立一个(n+1)*(m+1)的二维数组c,c[i][j]存储序列“a0,a1,a2……ai-2”和“b0,b1,……bj-1”的最长公共子序列长度,由上递推关系分析,计算c[i][j]可递归的表述如下: (1)c[i][j]=0 如果i=0或j=0;

spss时间序列模型

《统计软件实验报告》SPSS软件的上机实践应用 时间序列分析

数学与统计学学院 一、实验内容: 时间序列是指一个依时间顺序做成的观察资料的集合。时间序列分析过程中最常用的方法是:指数平滑、自回归、综合移动平均及季节分解。 本次实验研究就业理论中的就业人口总量问题。但人口经济的理论和实践表明,就业总量往往受到许多因素的制约,这些因素之间有着错综复杂的联系,因此,运用结构性的因果模型分析和预测就业总量往往是比较困难的。时间序列分析中的自回归求积分移动平均法(ARIMA)则是一个较好的选择。对于时间序列的短期预测来说,随机时序ARIMA是一种精度较高的模型。 我们已辽宁省历年(1969-2005)从业人员人数为数据基础建立一个就业总量的预测时间序列模型,通过spss建立模型并用此模型来预测就业总量的未来发展趋势。 二、实验目的: 1.准确理解时间序列分析的方法原理 2.学会实用SPSS建立时间序列变量 3.学会使用SPSS绘制时间序列图以反应时间序列的直观特征。

4.掌握时间序列模型的平稳化方法。 5.掌握时间序列模型的定阶方法。 6.学会使用SPSS建立时间序列模型与短期预测。 7.培养运用时间序列分析方法解决身边实际问题的能力。 三、实验分析: 总体分析: 先对数据进行必要的预处理和观察,直到它变成稳态后再用SPSS对数据进行分析。 数据的预处理阶段,将它分为三个步骤:首先,对有缺失值的数据进行修补,其次将数据资料定义为相应的时间序列,最后对时间序列数据的平稳性进行计算观察。 数据分析和建模阶段:根据时间序列的特征和分析的要求,选择恰当的模型进行数据建模和分析。 四、实验步骤: SPSS的数据准备包括数据文件的建立、时间定义和数据期间的指定。 SPSS的时间定义功能用来将数据编辑窗口中的一个或多个变量指定为时间序列变量,并给它们赋予相应的时间标志,具体操作步骤是: 1.选择菜单:Date→Define Dates,出现窗口:

最长公共子序列问题

2.3最长公共子序列问题 和前面讲的有所区别,这个问题的不涉及走向。很经典的动态规划问题。 例题16 最长公共子序列 (lcs.pas/c/cpp) 【问题描述】 一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X= < x1, x2,…, xm>,则另一序列Z= < z1, z2,…, zk>是X的子序列是指存在一个严格递增的下标序列< i1, i2,…, ik>,使得对于所有j=1,2,…,k有Xij=Zj 例如,序列Z=是序列X=的子序列,相应的递增下标序列为<2,3,5,7>。给定两个序列X 和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。例如,若X= < A, B, C, B, D, A, B>和Y= < B, D, C, A, B, A>,则序列是X和Y的一个公共子序列,序列也是X和Y的一个公共子序列。而且,后者是X和Y的一个最长公共子序列,因为X和Y没有长度大于4的公共子序列。 给定两个序列X= < x1, x2, …, xm>和Y= < y1, y2, … , yn>,要求找出X和Y的一个最长公共子序列。 【输入文件】 输入文件共有两行,每行为一个由大写字母构成的长度不超过200的字符串,表示序列X和Y。 【输出文件】 输出文件第一行为一个非负整数,表示所求得的最长公共子序列的长度,若不存在公共子序列,则输出文件仅有一行输出一个整数0,否则在输出文件的第二行输出所求得的最长公共子序列(也用一个大写字母组成的字符串表示。 【输入样例】 ABCBDAB BDCBA 【输出样例】 4 BCBA 【问题分析】 这个问题也是相当经典的。。 这个题目的阶段很不明显,所以初看这个题目没什么头绪,不像前面讲的有很明显的上一步,上一层之类的东西,只是两个字符串而且互相没什么关联。 但仔细分析发现还是有入手点的: 既然说是动态规划,那我们首先要考虑的就是怎么划分子问题,一般对于前面讲到的街道问题和数塔问题涉及走向的,考虑子问题时当然是想上一步是什么?但这个问题没有涉及走向,也没有所谓的上一步,该怎么办呢? 既然是求公共子序列,也就有第一个序列的第i个字符和第二个序列的第j个字符相等的情况。 那么我们枚第一个序列(X)的字符,和第二个序列(Y)的字符。 显然如果X[i]=Y[j]那么起点是1(下面说的子序列都是起点为1的),长度为i的子序列和长度为j的子序列的最长公共子序列就是长度为i-1和长度为j-1 的子序列中最长的公共子

最长公共子序列问题

实验三最长公共子序列问题 1.实验环境 本实验采用 java 语言编写实现,环境:,编译器: eclipse 2.实验目的 通过最长公共子序列问题,巩固并详细分析动态规划思想和解题 步骤。 3.设计思路 最长公共子序列的定义为:设有两个序列S[1..m]和9[仁n],需要寻找它们之间的一个最长公共子序列。 例如,假定有两个序列: S1: I N T H E B E G I N N I N G S2: A L L T H I N G S A R E L O S T 则S i和S的一个最长公共子序列为 THING又比如: S1: A B C B D A B S2: B D C A B A 则它们的一个最长公共子序列为 BCBA。 这里需要注意的是,一个子序列不一定必须是连续的,即中间可被其他字符分开,单它们的顺序必须是正确的。另外,最长公共子序列不一定只有一个,而我们需要寻找的是其中一个。

当然,如果要求子序列里面的元素必须连成一片也是可以的。实际上,连成一片的版本比这里实现的更容易。 4.过程 我们可以通过蛮力策略解决这个问题,步骤如下: 1.检查S1[1..m]里面每一个子序列。 2.看看其是否也是S2[1..n]里的子序列。 3.在每一步记录当前找到的子序列里面最长的子序列。 这种方法的效率十分低下。因此本实验采用动态规划的方法实现该算法。 利用动态规划寻找最长公共子序列步骤如下: 1.寻找最长公共子序列的长度。 2.扩展寻找长度的算法来获取最长公共子序列。 策略:考虑序列S1和S2的前缀序列。 设 c[i,j] = |LCS (S1[1..i],S2[1..j]),则有 c[m, n] = |LCS(S1 S2)| 所以有 c[ i -1 , j -1 ] + 1, 如要 S1[i] = S2[j] c[i, j]= max{ c [ i - 1, j ], c[ i , j -1 ] }, 如果 S1[i]工S2[j] 然后回溯输出最长公共子序列过程:

应用时间序列实验报告

河南工程学院课程设计 《时间序列分析课程设计》学生姓名学号: 学院:理学院 专业班级: 专业课程:时间序列分析课程设计指导教师: 2017年 6 月 2 日

目录 1. 实验一澳大利亚常住人口变动分析..... 错误!未定义书签。 实验目的............................................... 错误!未定义书签。 实验原理............................................... 错误!未定义书签。 实验内容............................................... 错误!未定义书签。 实验过程............................................... 错误!未定义书签。 2. 实验二我国铁路货运量分析........... 错误!未定义书签。 实验目的............................................... 错误!未定义书签。 实验原理............................................... 错误!未定义书签。 实验内容............................................... 错误!未定义书签。 实验过程............................................... 错误!未定义书签。 3. 实验三美国月度事故死亡数据分析...... 错误!未定义书签。 实验目的............................................... 错误!未定义书签。 实验原理............................................... 错误!未定义书签。 实验内容............................................... 错误!未定义书签。 实验过程............................................... 错误!未定义书签。课程设计体会 ............................ 错误!未定义书签。

最长公共子序列实验报告

最长公共子序列问题 一.实验目的: 1.加深对最长公共子序列问题算法的理解,实现最长公共子序列问题的求解算法; 2.通过本次试验掌握将算法转换为上机操作; 3.加深对动态规划思想的理解,并利用其解决生活中的问题。 二.实验内容: 1.编写算法:实现两个字符串的最长公共子序列的求解; 2.将输入与输出数据保存在文件之中,包括运行时间和运行结果; 3.对实验结果进行分析。 三.实验操作: 1.最长公共子序列求解: 将两个字符串放到两个字符型数组中,characterString1和characterString2,当characterString1[m]= characterString2[m]时,找出这两个字符串m之前的最长公共子序列,然后在其尾部加上characterString1[m],即可得到最长公共子序列。当characterString1[m] ≠characterString2[m]时,需要解决两个子问题:即找出characterString1(m-1)和characterString2的一个最长公共子序列及characterString1和characterString2(m-1)的一个最长公共子序列,这两个公共子序列中较长者即为characterString1和characterString2的一个最长公共子序列。 2.动态规划算法的思想求解: 动态规划算法是自底向上的计算最优值。 计算最长公共子序列长度的动态规划算法LCS-Length以characterString1和characterString2作为输入,输出两个数组result和judge1,其中result存储最长公共子序列的长度,judge1记录指示result的值是由那个子问题解答得到的,最后将最终的最长公共子序列的长度记录到result中。 以LCS-Length计算得到的数组judge1可用于快速构造序列最长公共子序列。首先从judge1的最后开始,对judge1进行配对。当遇到“↖”时,表示最长公共子序列是由characterString1(i-1)和characterString2(j-1)的最长公共子序列在尾部加上characterString1(i)得到的子序列;当遇到“↑”时,表示最长公共子序列和characterString1(i-1)与characterString2(j)的最长公共子序列相同;当遇到“←”时,表示最长公共子序列和characterString1(i)与characterString2(j-1)的最长公共子序列相同。 如图所示:

时间序列实验报告

第三章平稳时间序列分析 选择合适的模型拟合1950-2008年我国邮路及农村投递线路每年新增里程数序列,见表1: 表1 1950-2008年我国邮路及农村投递线路每年新增里程数序列 一、时间序列预处理 (一)时间序列平稳性检验 1.时序图检验 (1)工作文件的创建。打开EViews6.0软件,在主菜单中选择File/New/Workfile, 在弹出的对话框中,在Workfile structure type中选择Dated-regular frequency(时间序列数据),在Date specification下的Frequency中选择Annual(年度数),在Start date中输入“1950”(表示起始年

份为1950年),在End date中输入“2008”(表示样本数据的结束年份为2008年),然后单击“OK”,完成工作文件的创建。 (2)样本数据的录入。选择菜单中的Quick/Empty group(Edit Series)命令,在弹出的Group对话框中,直接将数据录入,并分别命名为year(表示年份),X(表示新增里程数)。 (3)时序图。选择菜单中的Quick/graph…,在弹出的Series List中输入“year x”,然后单击“确定”,在Graph Options中的Specifi中选择“XYLine”,然后按“确定”,出现时序图,如图1所示: 图1 我国邮路及农村投递线路每年新增里程数序列时序图从图1中可以看出,该序列始终在一个常数值附近随机波动,而且波动的围有界,因而可以初步认定序列是平稳的。为了进一步确认序列的平稳性,还需要分析其自相关图。 2.自相关图检验 选择菜单中的Quick/Series Statistics/Correlogram...,在Series Name 中输入x(表示作x序列的自相关图),点击OK,在Correlogram Specification 中的Correlogram of 中选择Level,在Lags to include中输入24,点击OK,得到图2:

时间序列分析实验报告

时间序列分析SAS软件实验报告: 以我国2002第一季度到2012年第一季度国内生产总值数据(季节效应模型)分析 班级:统计系统计0姓名: 学号: 指导老师: 20 年月日

时间序列分析报告 一、前言 【摘要】2012年3月5日温家宝代表国务院向大会作政府工作报告。温家宝在报告中提出,2012年国内生产总值增长7.5%。这是我国国内生产总值(GDP)预期增长目标八年来首次低于8%。 温家宝说,今年经济社会发展的主要预期目标是:国内生产总值增长7.5%;城镇新增就业900万人以上,城镇登记失业率控制在4.6%以内;居民消费价格涨幅控制在4%左右;进出口总额增长10%左右,国际收支状况继续改善。同时,要在产业结构调整、自主创新、节能减排等方面取得新进展,城乡居民收入实际增长和经济增长保持同步。 他指出,这里要着重说明,国内生产总值增长目标略微调低,主要是要与“十二五”规划目标逐步衔接,引导各方面把工作着力点放到加快转变经济发展方式、切实提高经济发展质量和效益上来,以利于实现更长时期、更高水平、更好质量发展。提出居民消费价格涨幅控制在4%左右,综合考虑了输入性通胀因素、要素成本上升影响以及居民承受能力,也为价格改革预留一定空间。 对于这一预期目标的调整,温家宝解释说,主要是要与“十二五”规划目标逐步衔接,引导各方面把工作着力点放到加快转变经济发展方式、切实提高经济发展质量和效益上来,以利于实现更长时期、更高水平、更好质量发展。 央行货币政策委员会委员李稻葵表示,未来若干年中国经济增长速度会有所放缓,这个放缓是必要的,是经济发展方式转变的一个必然要求。 【关键词】“十二五”规划目标国内生产总值增长率增速放缓提高发展质量附表:国内生产总值(2012年1季度) 绝对额(亿元)比去年同期增长(%) 国内生产总值107995.0 8.1 第一产业6922.0 3.8 第二产业51450.5 9.1 第三产业49622.5 7.5 注1:绝对额按现价计算,增长速度按不变价计算。注2:该表为初步核算数据。 GDP环比增长速度 环比增长速度(%) 2011年1季度 2.2 2季度 2.3 3季度 2.4 4季度 1.9 2012年1季度 1.8 注:环比增长速度为经季节调整与上一季度对比的增长速度。 此表是我国2012年第一季度国内生产总值及与2011年同期比较来源:前瞻网

应用时间序列实验报告

河南工程学院课程设计《时间序列分析课程设计》学生姓名学号: 学院:理学院 专业班级: 专业课程:时间序列分析课程设计 指导教师: 2017年6月2日

目录 1. 实验一澳大利亚常住人口变动分析 (1) 1.1 实验目的 (1) 1.2 实验原理 (1) 1.3 实验内容 (2) 1.4 实验过程 (3) 2. 实验二我国铁路货运量分析 (8) 2.1 实验目的 (8) 2.2 实验原理 (8) 2.3 实验内容 (9) 2.4 实验过程 (10) 3. 实验三美国月度事故死亡数据分析 (14) 3.1 实验目的 (14) 3.2 实验原理 (15) 3.3 实验内容 (15) 3.4 实验过程 (16) 课程设计体会 (19)

1.实验一澳大利亚常住人口变动分析 1971年9月—1993年6月澳大利亚常住人口变动(单位:千人)情况如表1-1所示(行数据)。 表1-1 (1)判断该序列的平稳性与纯随机性。 (2)选择适当模型拟合该序列的发展。 (3)绘制该序列拟合及未来5年预测序列图。 1.1 实验目的 掌握用SAS软件对数据进行相关性分析,判断序列的平稳性与纯随机性,选择模型拟合序列发展。 1.2 实验原理 (1)平稳性检验与纯随机性检验 对序列的平稳性检验有两种方法,一种是根据时序图和自相关图显示的特征做出判断的图检验法;另一种是单位根检验法。

(2)模型识别 先对模型进行定阶,选出相对最优的模型,下一步就是要估计模型中未知参数的值,以确定模型的口径,并对拟合好的模型进行显著性诊断。 (3)模型预测 模型拟合好之后,利用该模型对序列进行短期预测。 1.3 实验内容 (1)判断该序列的平稳性与纯随机性 时序图检验,根据平稳时间序列均值、方差为常数的性质,平稳序列的时序图应该显示出该序列始终在一个常识值附近波动,而且波动的范围有界。如果序列的时序图显示该序列有明显的趋势性或周期性,那么它通常不是平稳序列。 对自相关图进行检验时,可以用SAS 系统ARIMA 过程中的IDENTIFY 语句来做自相关图。 而单位根检验我们用到的是DF 检验。以1阶自回归序列为例: 11t t t x x φε-=+ 该序列的特征方程为: 0λφ-= 特征根为: λφ= 当特征根在单位圆内时: 11φ< 该序列平稳。 当特征根在单位圆上或单位圆外时: 11φ≥ 该序列非平稳。 对于纯随机性检验,既白噪声检验,可以用SAS 系统中的IDENTIFY 语句来输出白噪声检验的结果。 (2)选择适当模型拟合该序列的发展

动态规划法求解最长公共子序列(含Java代码)

公共子序列问题徐康123183 一.算法设计 假设有两个序列X和Y,假设X和Y分别有m和n个元素,则建立一个二维数组C[(m+1)*(n+1)],记录X i与Y j的LCS的长度。将C[i,j]分为三种情况: 若i =0 或j =0时,C[i,j]=0; 若i,j>0且X[i]=Y[j],C[i,j]=C[i-1,j-1]+1; 若i,j>0且X[i] Y[j],C[i,j]=max{C[i-1,j],C[i,j-1]}。 再使用一个m*n的二维数组b,b[i,j]记录C[i,j]的来向: 若X[i]=Y[j],则B[i,j]中记入“↖”,记此时b[i,j] = 1; 若X[i] Y[j]且C[i-1,j] > C[i,j-1],则b[i,j]中记入“↑”,记此时B[i,j] = 2; 若X[i] Y[j]且C[i-1,j] < C[i,j-1],则b[i,j]中记入“←”,记此时B[i,j] = 3; 若X[i]Y[j]且C[i-1,j] = C[i,j-1],则b[i,j]中记入“↑”或“←”,记此时B[i,j] = 4; 得到了两个数组C[]和B[],设计递归输出LCS(X,Y)的算法: LCS_Output(Direction[][], X[], i, j, len,LCS[]){ If i=0 or j=0 将LCS[]保存至集合LCS_SET中 then return; If b[i,j]=1 then /*X[i]=Y[j]*/ {LCS_Output(b,X,i-1,j-1); 将X[i]保存至LCS[len-i];} else if b[i,j]=2 then /*X[i]Y[j]且C[i-1,j]>C[i,j-1]*/ LCS_Output(b,X,i-1,j) else if b[i,j]=3 then /*X[i]Y[j]且C[i-1,j]

实验·6时间序列分析报告地spss应用

实验6 时间序列分析的spss应用 6.1 实验目的 学会运用SPSS统计软件创建时间数列,熟练掌握长期趋势线性模型拟合和季节变动测定的SPSS方法与技能。 6.2 相关知识(略) 6.3 实验内容 6.3.1 用SPSS统计软件创建时间序列的创建 6.3.2用SPSS统计软件处理长期趋势线性模型的拟合(最小二乘法、指数平滑法)及预测。 6.3.3掌握测定季节变动规律的SPSS测定方法。 6.4实验要求 6.4.1准备实验数据 6.4.2用SPSS统计软件创建彩电出口数量的时间序列 6.4.3用最小二乘法测定长期趋势,拟合线性趋势方程,并进行趋势预测。 6.4.4测定彩电出口数量的季节变动规律。 6.4.5用指数平滑法预测2014和2015年的彩电出口数量。 6.5 实验步骤 6.5.1 实验数据 为了研究某国彩电出口的情况,某研究机构收集了从2003-2013年某国彩电出口的月度数据,如表6-1所示。 表6-1 我国2003-2013年的我国彩电出口的月度数据(单位:万台)1月2月3月4月5月6月7月8月9月10月11月12月2003年12.53 13.73 24.45 28.75 32.45 31.11 25.94 32.98 43.49 42.94 63.29 77.28 2004年30.01 39.63 29.77 42.74 32.25 31.94 32.27 32.59 32.92 30.98 47.44 52.82 2005年24.08 16.42 31.24 29.33 31.88 30.09 28.08 32.99 44.99 47.57 50.36 75.19 2006年39.02 25.81 43.38 37.34 39.22 39.87 51.10 50.99 55.16 62.78 57.75 72.20 2007年28.76 39.38 46.10 39.41 38.74 40.18 45.59 43.31 46.68 54.17 53.65 61.12 2008年28.87 21.23 35.82 26.97 32.33 24.53 29.39 31.96 38.22 39.24 52.95 68.41

相关主题
文本预览
相关文档 最新文档