作业要求
| 这个作业属于哪个课程 | 班级链接 |
|---|---|
| 这个作业要求在哪里 | 作业要求的链接 |
| 这个作业的目标 | 完成论文查重项目,学习使用PSP表格。 |
一、个人仓库
Jhao777/3121005175 (github.com)
二、PSP表格(开始程序之前)
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 40 | |
| · Estimate | 估计这个任务需要多少时间 | 650 | |
| Development | 开发 | 500 | |
| · Analysis | · 需求分析 (包括学习新技术) | 120 | |
| · Design Spec | 生成设计文档 | 30 | |
| Design Review | 设计复审 | 15 | |
| Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 15 | |
| Design | 具体设计 | 15 | |
| · Coding· | 具体编码 | 70 | |
| Code Review | · 代码复审 | 60 | |
| Test | · 测试(自我测试,修改代码,提交修改) | 60 | |
| Reporting | 报告 | 120 | |
| Test Repor · | 测试报告 | 120 | |
| Size Measurement | · 计算工作量 | 30 | |
| Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 15 | |
| 合计 | 1860 |
三、计算模块接口的设计与实现过程
3.1 需求分析
检测文件内容的相似度并将结果输出到另一个文件中
- 读入文件并转换成字符串
- 利用Levenshtein编辑距离算法计算两字符串的相似度
- 输出至目标文件
3.2 模块及类的分析与实现
- main:main 方法所在的类
- FileToStr:用于读取文件并将文件字符转换成字符串
- Distance:利用Levenshtein算法计算相似度
- StrToFile:将结果输出到目标文件

Distance 类中的代码使用了莱文斯坦编辑距离(Levenshtein Edit Distance)算法来计算两个字符串之间的相似度。这个算法的核心思想是测量从一个字符串转换为另一个字符串所需的最少编辑操作次数(插入、删除、替换)。
以下是该算法的数学原理:
-
初始化矩阵: 创建一个二维矩阵
dp,其中dp[i][j]表示将字符串s1的前i个字符转换为字符串s2的前j个字符所需的最小编辑距离。矩阵的大小为(s1.length() + 1) x (s2.length() + 1)。 -
初始化边界条件: 在矩阵的第一行和第一列中,分别填入0到
s1.length()和0到s2.length()的值,表示将一个字符串转换为空字符串所需的编辑操作次数。 -
填充矩阵: 对于每个
dp[i][j],计算三种可能的编辑操作的成本:- 插入:将
s1的第i个字符插入到s2的前j个字符之后,成本为dp[i][j-1] + 1。 - 删除:删除
s1的第i个字符,成本为dp[i-1][j] + 1。 - 替换:如果
s1的第i个字符和s2的第j个字符不相等,替换s1[i]为s2[j],成本为dp[i-1][j-1] + 1。如果相等,成本为dp[i-1][j-1]。
dp[i][j]被更新为上述三种操作中的最小成本。 - 插入:将
-
计算相似度: 最终,编辑距离被存储在
dp[s1.length()][s2.length()]中。为了计算相似度,我们使用以下公式:相似度 = 1 - (编辑距离 / max(s1.length(), s2.length()))这将编辑距离映射到一个0到1的值,其中0表示完全不同,1表示完全相同。
总结来说,Distance 类的代码通过填充矩阵 dp 来计算两个字符串之间的编辑距离,然后将编辑距离映射为相似度,其中更小的编辑距离表示更高的相似度。
四、计算模块部分的性能改进
4.3 性能分析(IDEA2023/JProfiler)

4.4 方法调用情况

五、单元测试
5.1、文件读取
public static void main(String[] args) throws IOException {
try {
// 读取原文和抄袭版论文的内容
String a = FileToStr.readFileToString("C:\\Users\\Administrator\\Desktop\\IT lesson works\\No.1\\1\\src\\a.txt");
String b = FileToStr.readFileToString("C:\\Users\\Administrator\\Desktop\\IT lesson works\\No.1\\1\\src\\b.txt");
System.out.print(a+"\n"+b);
} catch (IOException e) {
// 捕捉并处理IO错误
System.err.println("发生IO错误: " + e.getMessage());
System.exit(1);
}
}
运行结果:

测试没有问题
5.2、距离计算与覆盖率
运行结果:

测试没有问题
六. 异常处理
//本次作业没有设计额外异常仅运用io包中的几个异常类
import java.io.FileNotFoundException;
//文件查找异常,当地址错误或其他特殊情况抛出
import java.io.IOException;
//文件读取或写出出现异常或输入输出流关闭异常时抛出
七、PSP表格(完成程序之后)
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 40 | 30 |
| · Estimate | 估计这个任务需要多少时间 | 650 | 700 |
| Development | 开发 | 500 | 400 |
| · Analysis | · 需求分析 (包括学习新技术) | 120 | 100 |
| · Design Spec | 生成设计文档 | 30 | 30 |
| Design Review | 设计复审 | 15 | 15 |
| Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 15 | 15 |
| Design | 具体设计 | 15 | 15 |
| · Coding· | 具体编码 | 70 | 100 |
| Code Review | · 代码复审 | 60 | 50 |
| Test | · 测试(自我测试,修改代码,提交修改) | 60 | 120 |
| Reporting | 报告 | 120 | 100 |
| Test Repor · | 测试报告 | 120 | 100 |
| Size Measurement | · 计算工作量 | 30 | 50 |
| Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 15 | 15 |
| 合计 | 1860 | 1840 |
浙公网安备 33010602011771号