软件工程第二次作业——个人项目

这个作业属于哪个课程 班级的链接
这个作业要求在哪里 作业要求的链接
这个作业的目标 完成个人项目并编写博客报告

一、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 并退出

posted @ 2025-09-22 19:23  melu  阅读(19)  评论(0)    收藏  举报