软件工程 | 软件工程 |
---|---|
作业要求 | 作业要求 |
作业目标 | 论文查重算法设计、PSP表格设计、单元测试、性能测试、Git上传文件 |
一.github链接:https://github.com/deerc123/learngit
二.PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30min | 20min |
·Estimate | ·估计这个任务需要多少时间 | 1440min | 1200min |
Development | 开发 | 60min | 60min |
·Analysis | 需求分析(包括学习新技术) | 120min | 150min |
·Design Spec | ·生成设计文档 | 60min | 30min |
·Design Review | ·设计复审 | 30min | 30min |
·Coding Standard | ·代码规范(为目前的开发制定合适的规范) | 30min | 40min |
·Design | ·具体设计 | 90min | 120min |
·Coding | ·具体编码 | 240min | 300min |
·Code Review | ·代码复审 | 60min | 30min |
·Test | ·测试(自我测试,修改代码,提交修改) | 480min | 180min |
Reorting | 报告 | 90min | 60h |
·Test Report | ·测试报告 | 60min | 60min |
·Size Measurement | ·计算工作量 | 60min | 30min |
·Postmortem&Process Improvement Plan | ·事后总结,并提出过程改进计划 | 30min | 30min |
合并 | 1440min | 1140min |
三.计算模块接口的设计与实现过程
1.算法原理
最小编辑距离算法计算文本相似度:
Levenshtein Distance 算法,又叫 Edit Distance 算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。
许可的编辑操作包括:替换一个字符;
插入一个字符;
删除一个字符。
例如字符串learn和mean可以通过“替换”和“删除”来实现目的,所以它们的最小编辑距离为2。
用edit[i][j]表示A串和B串的编辑距离。edit[i][j]表示A串从第0个字符开始到第i个字符和B串从第0个字符开始到第j个字符,这两个字串的编辑距离。字符串的下标从1开始。
dis[0][0]表示word1和word2都为空的时候,此时他们的Edit Distance为0。很明显可以得出的,dis[0][j]就是word1为空,word2长度为j的情况,此时他们的Edit Distance为j,也就是从空,添加j个字符转换成word2的最小Edit Distance为j;同理dis[i][0]就是,word1长度为i,word2为空时,word1需要删除i个字符才能转换成空,所以转换成word2的最小Edit Distance为i。
则从上面的分析,不难推导出动态规划方程:
上式中的min()函数中的三个部分,对应三种字符操作方式:
edit[i-1][j]+1相当于给word2的最后插入了word1的最后的字符,插入操作使得edit+1,之后计算edit[i-1][j];
edit[i][j-1]+1相当于将word2的最后字符删除,删除操作edit+1,之后计算edit[i][j-1];
edit[i-1][j-1]+flag相当于通过将word2的最后一个字符替换为word1的最后一个字符。flag标记替换的有效次数。
2.总流程
(1)main函数:输入原文件和对比文件——>读取文件——>将文件文本转换为String——>调用CompareStrSimUtil函数;
(2)CompareStrSimUtil函数:构建矩阵并计算最小编辑距离,将所得的相似度百分比结果返回。
3.主要函数
(流程图)
(代码)
4.cmd运行结果:
四.计算模块接口部分的性能改进
1.所有对象内存分配情况
2.所有方法消耗时间占比情况
由图可得,compare方法耗时占比最多。
3.运行时间
1.0s<5s,运行时间合理。
4.代码改进:
改进前(代码):
改进后(代码):
在main函数里添加了去除文本标点符号的代码操作,先将StringBuilder转化为String,然后调用String的正则表达式方法,提升了文本相似度的正确性。
五.计算模块部分单元测试展示
单元测试:
测试运行耗时:
测试代码覆盖率:
个人总结
(1)在这次个人项目中,我一开始并没有很早去准备,在拖延了几天后才着手去准备这次个人项目,导致后面的每天都耗费了大量时间在个人项目上,且完成得很草率,还有很多可以完善的点并没有很好地完成,在时间观念上对项目设计有了更为清晰的认知。
(2)这次个人项目也让我不由地赞叹Git的功能之强大,我也学习到了一些软件设计的小知识,并且初步了解了JProfiler、Git等软件,并且对老师课上所讲述的单元测试和性能测试有了更为客观的了解。
(3)PSP表格确实提高了软工项目设计的总效率,让我更直观地把握了设计前后的时间分配。