软工第二次作业
课程 | 软件工程 |
---|---|
作业要求 | 个人编程 |
作业的目标 | 实现一个论文查重程序,规范软件开发流程,熟悉Github进行源代码管理和学习软件测试 |
GitHub仓库 | https://github.com/visionQAQ/3123004274 |
psp2表格
PSP2 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 20 |
Estimate | 估计这个任务需要多少时间 | 80 | 90 |
Development | 开发 | 200 | 240 |
Analysis | 需求分析 (包括学习新技术) | 30 | 120 |
Design Spec | 生成技术文档 | 30 | 30 |
Design Review | 设计复审 | 20 | 30 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 20 | 10 |
Design | 具体设计 | 30 | 50 |
Coding | 具体编码 | 150 | 150 |
Code Review | 代码复审 | 20 | 20 |
Test | 测试(自我测试,修改代码,提交修改) | 20 | 40 |
Reporting | 报告 | 60 | 60 |
Test Repor | 测试报告 | 20 | 20 |
Size Measurement | 计算工作量 | 50 | 45 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 20 | 20 |
计算模块接口的设计与实现过程:1个PaperCheck类
6个函数:
main(String[] args) - 主函数,程序入口
readFile(String filePath) - 文件读取
writeFile(String filePath, String content) - 文件写入
calculateEditDistance(String s1, String s2) - 核心算法实现
calculateEditDistanceSimilarity(String text1, String text2) - 相似度计算
调用关系:
main() 调用所有其他函数;calculateEditDistanceSimilarity() 调用 calculateEditDistance();其他函数之间没有直接调用关系
核心算法:编辑距离,计算将一个字符串转换为另一个字符串所需的最少单字符编辑操作次数(包括插入、删除和替换)来实现。
动态规划:使用二维数组存储子问题解
三种操作:插入、删除、替换字符
时间复杂度:O(m×n)
空间复杂度:O(m×n)
计算模块接口部分的性能改进:空间复杂度优化
// 优化后的编辑距离计算(空间优化版)
private static int calculateEditDistanceOptimized(String s1, String s2) {
int m = s1.length();
int n = s2.length();
// 只保留两行,空间复杂度从O(m*n)降到O(min(m,n)))
int[] prev = new int[n + 1];
int[] curr = new int[n + 1];
for (int j = 0; j <= n; j++) {
prev[j] = j;
}
for (int i = 1; i <= m; i++) {
curr[0] = i;
for (int j = 1; j <= n; j++) {
int cost = (s1.charAt(i - 1) == s2.charAt(j - 1)) ? 0 : 1;
curr[j] = Math.min(Math.min(
prev[j] + 1, // 删除
curr[j - 1] + 1), // 插入
prev[j - 1] + cost // 替换
);
}
// 交换数组引用
int[] temp = prev;
prev = curr;
curr = temp;
}
return prev[n];
}
计算模块部分异常处理说明:FileNotFoundException 处理文件不存在或路径错误
IllegalArgumentException处理无效的输入参数
文本长度异常,内存溢出
CharacterCodingException
处理文件编码问题