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

上传人:苏美尔 文档编号:5731369 上传时间:2020-07-25 格式:DOC 页数:4 大小:113KB
返回 下载 相关 举报
最长公共子序列实验报告.doc_第1页
第1页 / 共4页
最长公共子序列实验报告.doc_第2页
第2页 / 共4页
最长公共子序列实验报告.doc_第3页
第3页 / 共4页
最长公共子序列实验报告.doc_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《最长公共子序列实验报告.doc》由会员分享,可在线阅读,更多相关《最长公共子序列实验报告.doc(4页珍藏版)》请在三一文库上搜索。

1、最长公共子序列问题 一 实验目的: 1. 加深对最长公共子序列问题算法的理解,实现最长公共子序列问题的求解算法;2. 通过本次试验掌握将算法转换为上机操作;3. 加深对动态规划思想的理解,并利用其解决生活中的问题。二 实验内容:1. 编写算法:实现两个字符串的最长公共子序列的求解;2. 将输入与输出数据保存在文件之中,包括运行时间和运行结果;3. 对实验结果进行分析。三 实验操作:1. 最长公共子序列求解: 将两个字符串放到两个字符型数组中,characterString1和characterString2,当characterString1m= characterString2m时,找出这两

2、个字符串m之前的最长公共子序列,然后在其尾部加上characterString1m,即可得到最长公共子序列。当characterString1m characterString2m时,需要解决两个子问题:即找出characterString1(m-1)和characterString2的一个最长公共子序列及characterString1和characterString2(m-1)的一个最长公共子序列,这两个公共子序列中较长者即为characterString1和characterString2的一个最长公共子序列。2. 动态规划算法的思想求解:动态规划算法是自底向上的计算最优值。计算最长公共

3、子序列长度的动态规划算法LCS-Length以characterString1和characterString2作为输入,输出两个数组result和judge1,其中result存储最长公共子序列的长度,judge1记录指示result的值是由那个子问题解答得到的,最后将最终的最长公共子序列的长度记录到result中。以LCS-Length计算得到的数组judge1可用于快速构造序列最长公共子序列。首先从judge1的最后开始,对judge1进行配对。当遇到“”时,表示最长公共子序列是由characterString1(i-1)和characterString2(j-1)的最长公共子序列在尾部

4、加上characterString1(i)得到的子序列;当遇到“”时,表示最长公共子序列和characterString1(i-1)与characterString2(j)的最长公共子序列相同;当遇到“”时,表示最长公共子序列和characterString1(i)与characterString2(j-1)的最长公共子序列相同。如图所示:时间复杂度公式:代码实现:void LCSLength(char* characterString1,char* characterString2,int length1,int length2,int judge10000) int result10010

5、0; for(int i=0;i=length1;i+) resulti0=0; for(int j=1;j=length2;j+) result0j = 0; for(int i=1;i=length1;i+) for(int j=1;j=resultij-1) resultij=resulti-1j; judgeij=1; else resultij=resultij-1; judgeij=-1; void LCS(int judge10000,char* characterString1,int length1,int length2)/得到最长公共子序列 if(length1=0|le

6、ngth2=0) return; if(judgelength1length2=0) LCS(judge,characterString1,length1-1,length2-1); record(characterString1length1-1);/存入文件 cout-1) return judge2length1length2; if(length1=0|length2=0) judge2length1length2=0; else if(characterString1length1-1=characterString2length2-1) judge2length1length2=s

7、earchLCS(characterString1,characterString2,length1-1,length2-1)+1; else judge2length1length2=max(searchLCS(characterString1,characterString2,length1,length2-1), searchLCS(characterString1,characterString2,length1-1,length2); return judge2length1length2;int memorizedLCS(char* characterString1,char* c

8、haracterString2) int length1=strlen(characterString1); int length2=strlen(characterString2); for(int i=1;i=length1;i+) for(int j=1;j=length1|j=length2) return 0; if(characterString1i=characterString2j) return 1+recursionLCS(i+1,j+1); else return recursionLCS(i+1,j)recursionLCS(i,j+1)?recursionLCS(i+

9、1,j):recursionLCS(i,j+1);5. 穷举法: 将数组characterString1和characterString2两个字符串的所有字串求出,并将这些字串相互比较,直到找的最长公共子序列为止,当字符串的长度很长时,所要求取的子串序列相当多,故所开销的时间最多。四 实验结果分析: 当输入字符串长度分别为(20,20),(34,78),(98,145)时,在动态规划算法、备忘录算法、递归算法得到的时间分别为(0,0,0),(0,16,22),(0,16,34),由于在多次测量下不稳定,故不做具体展示。 得到上述情况是由于生成的字符串具有不确定性,以及代码的不完善,不能对大数据进行时间测量。五 实验感受: 本次实验对字符串的反复递归,对栈的操作经常发生访问冲突的错误,故只能才用少量的数据处理,并且当数据存放到文件中时,子函数和主函数对同一文件的操作有覆盖和不显示的问题,故创建了两个文本文件用于对实验结果的存放。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1