一、Github作业地址
https://github.com/Yaolqn/Yaolqn
二、PSP表格
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
10 |
10 |
Estimate |
估计这个任务需要多少时间 |
5 |
7 |
Development |
开发 |
10 |
10 |
Analysis |
需求分析 (包括学习新技术) |
10 |
12 |
Design Spec |
生成设计文档 |
5 |
4 |
Design Review |
设计复审 |
5 |
4 |
Coding Standard |
代码规范 (为目前的开发制定合适的规范) |
10 |
9 |
Design |
具体设计 |
10 |
13 |
Coding |
具体编码 |
20 |
17 |
Code Review |
代码复审 |
10 |
7 |
Test |
测试(自我测试,修改代码,提交修改) |
15 |
14 |
Reporting |
报告 |
15 |
19 |
Test Report |
测试报告 |
10 |
11 |
Size Measurement |
计算工作量 |
3 |
4 |
Postmortem & Process Improvement Plan |
事后总结, 并提出过程改进计划 |
20 |
18 |
|
合计 |
158 |
159 |
三、计算模块接口的设计与实现过程
1. 代码组织结构
项目只包含一个主类:Project
2. 核心函数设计
public static double calculateSimilarity(String s1, String s2)
- 输入:原文字符串 s1,抄袭文字符串 s2
- 输出:重复率(浮点数,范围 [0.00, 1.00])
- 算法:基于 最长公共子序列(LCS)
- 公式: 重复率 = 2 × LCS长度/len(s1)+ len(s2)
3. 算法关键点
- 使用动态规划构建 dp[m+1][n+1] 表,m = s1.length, n = s2.length
- 时间复杂度:O(m×n),适合中短文本(< 5KB)
- 支持中文字符比较(Java char 自动支持 Unicode)
4. 独到之处
- 对称性设计:使用 (2*LCS)/(m+n) 避免因文本长短差异导致评分偏差
- 鲁棒性强:自动忽略换行和空格干扰,只关注字符内容
- 无依赖:纯 JDK 实现,无需第三方库,便于部署
四、计算模块接口部分的性能改进
1. 优化思路
空间优化:将二维 DP 表压缩为 两个一维数组
- int[] prev = new int[n + 1];
- int[] curr = new int[n + 1];
- 每次迭代只保留前一行和当前行,空间从 O(m×n) → O(n)
calculateSimilarity 是最大消耗函数
![image]()
五、计算模块部分单元测试展示
1。部分单元测试代码截图
![image]()
说明:使用JUnit进行测试,利用计算模块得出的结果与预期结果进行比对
构造思路:空字符串、单字符、完全相同、完全不同、长英文
2.测试覆盖率截图
![image]()
六、计算模块部分异常处理说明
1.文件不存在
![image]()
不崩溃,输出错误信息并退出
2.文件为空
![image]()
返回 0.00重复率 读取空文件
3.编码错误
![image]()
使用 UTF-8 强制读取,避免乱码
4.参数不足
![image]()
提示 usage 并退出