这个作业属于哪个课程 | 软件工程 |
---|---|
这个作业要求在哪里 | 在这里 |
这个作业的目标 | 了解PSP,写一个论文查重程序,使用github管理项目 |
PSP表
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 20 |
Estimate | 估计这个任务需要多少时间 | 480 | 1640 |
Development | 开发 | 120 | 120 |
Analysis | 需求分析(包括学习新技术) | 120 | 480 |
Design Spec | 生成设计文档 | 10 | 10 |
Design Review | 设计复审 | 10 | 10 |
Coding Standard | 代码规范(为目前的开发指定合适的规范) | 10 | 10 |
Design | 具体设计 | 120 | 120 |
Coding | 具体编码 | 120 | 120 |
Code Review | 代码复审 | 60 | 60 |
Test | 测试(自我测试,修改代码,提交修改) | 30 | 30 |
Reporting | 报告 | 60 | 60 |
Test Repor | 测试报告 | 60 | 60 |
Size Measurement | 计算工作量 | 30 | 30 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 30 | 30 |
合计 | 1280 | 1640 |
计算模块接口的设计与实现过程
该项目只包含一个main函数,完成输入输出与计算。
使用最长公共子序列算法来计算重复字符的数量。
记两个字符串分别为a,b; dp[i][j]为以a[i]和b[j]结尾的两个字串的最长公共子序列,
则当a[i] = b[j] 时 dp[i][j] = 1 + dp[i-1][j-1]
否则 dp[i][j] = max(dp[i-1][j], dp[i][j-1])
计算模块接口部分的性能改进
-
假设该算法最多能够处理两个长100000的字符串,直接开一个dp数组所需要的大小为10^10。考虑到每次计算式只需要使用到dp[i]和dp[i-1]两行的数据,因此可以开一个dp[2][100000]数组,用滚动的方式计算。
-
由VS性能探查器生成的性能分析图:
计算模块单元测试展示
- 单元测试部分代码截图
- 该部分代码用来测试最长公共子序列函数能够正常工作
- 代码覆盖率如下
计算模块异常部分处理说明
- 空文件处理,用来防止读入空文件。
- 大文件处理,用来防止程序内存溢出