- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
UNIX简单shell的设计和实现实验报告
UNIX第一次实验报告
实验题目
实验1 简单shell
练习使用编程环境,包括shellvi和gcc编译器。
体会进程概念,了解fork,execve,wait
要求:
1、除了系统调用execve,exec函数。输入应当允许带多个参数(一行内可以表示),不考虑通配符 (即“*”、“?”、“-”等等)的处理。
2、输入错误命令能提示出错并进入下一轮接收命令状态。3、可以用Ctrl-CCtrl-\结束简单shell的运行。
4、程序运行正确,提示简洁明确。
UNIX 虚拟环境
题目分析
实验一利用课本第9页程序1-5的框架,实现允许输入命令带参数的简单shell。原来的实现是不能够带参数的。输入命令所能带的参数个数,只受到系统键盘输入缓冲区长度(以及shell输入缓冲区长度)的限制,该缓冲区的缺省长度是4096个字节。实现时要解决的主要问题有:
正确理解并使用系统调用fork(),execve()和waitpid();
根据简单shell的输入,构造execve函数的参数。
根据程序1-5,数组buf保存用户的输入,包括命令和参数。由于shell命令的命令名和各参数之间是用空格分开,因此可以用空格作为分界符。通过一个循环可以把buf数组中的命令和各个参数依次分离开来,并赋给数组argv的各元素适当的指针值。argv数组的最后一个指针必须是NULL。接着就可以调用execve(argv[0],argv, environ)来执行用户输入的命令。
算法设计
基本动态规划方法
基本思想:⑴、计算所给定的两个序列整个的相似分值,并得到一个相似度矩阵(similarity matrix),也称做动态规划矩阵或得分矩阵;⑵根据相似度矩阵,按照动态规划的方法回溯寻找最优的联配。
递归关系
算法描述
节省空间的全局比对算法
在利用动态规划表法计算时,每个数值只与前一行和本行的值有关,所以可以算完一行删掉一行,这样就在线性空间里解决的全局比对。
算法描述
回溯
Hirschberg提出了一种更加实际的回溯算法,利用分治的思想,把空间复杂度从O(nm)减少到O(m),其中m n。我们定义Vr( i, j )为序列S的后i个字符所组成的子序列和序列T的后j个字符所组成的子序列的最优联配的分值。
定理:
在这个定理的基础上,Hirschberg给出了计算全局最优联配的算法:
计算V(n/2, m),并将所得的分值存储于前趋矩阵F中
计算Vr(n/2, m),并将所得的分值存储于后续矩阵B中
寻找某一列k,使得在交叉点(n/2, k)处满足:
F( n/2, k) + B( n/2, m-k) = F( n, m)
将回溯任务划分为两个子问题:
在(0, 0)到(n/2, k)之间,找出一条最佳的路径
在(n, m)到(n/2, m-k)之间,找出一条最佳的路径
遇到的问题与解决方案
基本动态规划方法动态规划表无法建立
问题:最开始我想用基本DP方法解决,可是发现给定的DNA序列长度长达一万六千多个字符,16000*16000这样的数组在java虚拟机中开辟不出来,导致后面程序无法继续。
解决方案:参考老师上课的幻灯片以及网上的资料,我采用线性空间的算法解决了问题,虽然多花了一些时间,可是总比算不出来好。
Hirschberg算法回溯出口问题
问题:在利用Hirschberg算法回溯时,当分治后的序列足够短时如何让程序正确的跳出
解决方案:两个字符串s, t,当其中有一个字符串的长度小于等于1时,则不再进行分治,而进入判断输出阶段。在判断环节,如果s和t中有一个长度为0,则说明另一个字符串对应的都是空格;如果其中一个字符串长度为1,即只有一个字符,则将这个字符与另一个字符串中的每个字符比较,如果相同就算对上,若不同则对空格,要是比到最后一个都没对上,则强制错对最后一个字符。
找分治点时用时过长问题
问题:在回溯时,S的每个确定的分点S[i]要与T字符串的每个字符依次进行判断,而且每次判断需要算两次全局比对,很费时间。
解决方案:直接从T字符串的中点开始寻找,并向两边依次寻找。
实验代码及结果
另附压缩包。
实验心得
合作
这次实验虽然老师要求每个人独立完成,但是我在代码调试阶段得到了任智宇同学的大力帮助。尤其是Hirschberg算法出口的问题上我们一起研究了很长时间。而且工程中的Output类主要由任智宇编写。所以希望老师能够认可我们的合作。
多渠道获取信息与耐心调试
这次实验所涉及的课件基本上都是英文的,理解起来有一定困难,所以我通过互联网找了很多相关。其实这次工程的框架早已构建好了,就是一直在头疼那个分治思想的回溯方法,之后又在调试那个出口问题。在彻底明白分治思想之前,曾经试过很多幼稚的方法,比如直接截成四段,还有妄想把动态规划表
文档评论(0)