软工第二次作业

news/2024/9/19 15:35:43/文章来源:https://www.cnblogs.com/rawven/p/18407518

软工作业2:个人项目-论文查重

GitHub链接: github

课程信息

  • 课程: 计科22级2班 - 广东工业大学
  • 作业要求: 作业要求
  • 目标: 完成个人项目-论文查重;学会写单元测试

一、PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 60 30
Estimate 估计这个任务需要多少时间 30 60
Development 开发 300 420
Analysis 需求分析 (包括学习新技术) 60 30
Design Spec 生成设计文档 60 60
Design Review 设计复审 15 10
Coding Standard 代码规范 15 10
Design 具体设计 30 60
Coding 具体编码 30 60
Code Review 代码复审 15 10
Test 测试(自我测试,修改代码,提交修改) 15 60
Reporting 报告 60 120
Test Report 测试报告 30 60
Size Measurement 计算工作量 10 10
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 10 20
合计 740 1020

二、设计与开发

编码规范

  • 阿里巴巴开发规范插件

2.1 开发环境

  • 操作系统: Windows
  • 编程语言: JDK 1.8

2.2 开发工具

  • Maven包管理工具
  • IDE: IDEA 2022.3.1
  • 性能分析工具: JProfiler 11.1.4

2.3 项目依赖

  • JUnit测试框架
  • Jieba-Java中文分词库

2.4 算法设计说明

longestCommonSubsequence (LCS) 算法

  • 动态规划

    • 使用动态规划来计算 LCS。创建一个二维数组 dp,其中 dp[i][j] 表示前 i 个字符和前 j 个字符的 LCS 长度。
    • 遍历两个字符串的每个字符:
      • 如果字符相同,则 LCS 长度为 dp[i-1][j-1] + 1
      • 如果字符不同,则 LCS 长度为 Math.max(dp[i-1][j], dp[i][j-1]),即取左边或上边的最大值。
  • 时间复杂度

    • LCS 算法的时间复杂度为 O(m × n),其中 m 和 n 分别是两个字符串的长度。
  • 空间复杂度

    • 空间复杂度为 O(m × n),用于存储动态规划表。如果需要优化空间,可以只保留当前行和上一行的数据。
  • 优点

    • LCS 算法简单直观,适合用于文本相似度检测。
    • 结果能够有效反映文本之间的相似性。
  • 缺点

    • 对于较长的文本,计算复杂度较高,可能导致性能问题。
    • 仅依赖于字符匹配,无法捕捉文本的语义信息。

2.5 接口设计与实现过程

类设计与实现过程

1. 文件处理类 (FileHandler)

设计目的

FileHandler 类的主要目的是封装文件操作,以便于读取和写入文本文件。通过将文件操作集中在一个类中,代码变得更加模块化,便于维护和重用。

实现过程

  • 读取文件

    • 使用 Files.readAllBytes 方法读取文件内容,并转换为字符串。
    • 处理可能的 IOException,确保文件读取的安全性。
  • 写入文件

    • 使用 Files.writeString 方法将内容写入文件。添加了 StandardOpenOption.APPEND 选项以确保内容被追加,而不是覆盖。
    • 添加换行符,确保每次追加内容都在新的一行开始。

2. 相似度计算类 (SimilarityCalculator)

设计目的

SimilarityCalculator 类专注于计算文本之间的相似度,主要采用最长公共子序列(LCS)算法。将相似度计算逻辑与文件处理分开,有助于清晰地划分责任。

实现过程

  • 计算相似度

    • 定义 calculateSimilarity 方法,接收两个字符串参数(原始文本和抄袭文本)。
    • 调用 longestCommonSubsequence 方法计算 LCS 长度。
    • 使用公式计算相似度,并通过 DecimalFormat 确保结果保留两位小数。
  • LCS 算法实现

    • 使用两个一维数组 prevcurr,将空间复杂度优化为 O(n)
    • 通过动态规划遍历两个字符串,更新数组以计算 LCS 长度。

主程序类 (PaperCheck)

设计目的

PlagiarismDetector 类作为程序的入口,负责协调文件处理和相似度计算的工作。它集成了其他两个类,形成完整的程序。

实现过程

  • 主方法
    • main 方法中创建 FileHandlerSimilarityCalculator 的实例。
    • 调用 FileHandlerreadFile 方法读取原始文本和抄袭文本。
    • 调用 SimilarityCalculatorcalculateSimilarity 方法计算相似度。
    • 将相似度结果格式化并写入输出文件,同时打印到控制台。

三、测试与性能分析

3.1 测试

运行时JProfiler分析

覆盖率

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/795244.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pyqt5 实现多标签页面

实现功能代码实现 import sysfrom PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QVBoxLayout, QPushButton, QWidget, QLabel, \QDesktopWidgetclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.ini_ui()def ini_ui(self):self.se…

gitee【下载文件】

1.配置公钥(如果是新设备) ssh-keygen -t ed25519 -C "Gitee SSH Key"输入这行命令,按3次回车,演示如下: 生成的公钥就在红框文件夹下复制该字符串,进入gitee的设置中,找到公钥粘贴该字符串配置完后可用该命令测试 ssh -T [git@gitee.com](mailto:git@gitee.c…

gitee【上传文件】

1.配置公钥 ssh-keygen -t ed25519 -C "Gitee SSH Key"输入这行命令,按3次回车,演示如下: 生成的公钥就在红框文件夹下复制该字符串,进入gitee的设置中,找到公钥粘贴该字符串配置完后可用该命令测试 ssh -T [git@gitee.com](mailto:git@gitee.com)2.新建仓库并配…

【技术积累】腾讯/阿里云对象存储上传+删除

腾讯/阿里云对象存储上传+删除创建储存桶 (后面会用到 储存库名称、访问域名、以及region) region(地域和访问域名)的查询参考: https://cloud.tencent.com/document/product/436/6224 https://www.aliyun.com/product/oss常用的阿里云、腾讯云2.创建Api密钥 (后面会用到…

虚拟机安装 gho系统

1.新建 虚拟机2.使用 _优先安装WePE_64_V2.3.exe 制作一个可启动iso3.gho文件 用UltraISO 制作为一个iso文件4.虚拟机用 前面制作的iso文件启动后 分区 ,然后启动 gho工具,再加载iso文件5.此时可以进行克隆还原了

Qt使用绿色pdf阅读器打开文件

1.下载SumatraPDF 2.设置 3.代码void MainWindow::on_pushButton_clicked() {QProcess *process = new QProcess();QString filePath = "C:\\Users\\jude\\Desktop\\su\\11.pdf";QString sumatraPath = "C:\\Users\\jude\\Desktop\\su\\SumatraPDF-3.5.2-64.exe…

基于tf-idf的论文查重

基于tf-idf的论文查重 github地址:https://github.com/gomevie/gomevie/tree/main这个作业属于哪个课程 广工计院计科34班软工这个作业要求在哪里 作业要求 这个作业的目标 设计并实现一个论文查重算法,通过比较原文和抄袭版论文文件,计算并输出重复率。PSP表格PSP2.1 Pers…

Java SE 语法学习

JavaSE 语法 java数据类型基本数据类型整数类型byte 占1个字节,范围:-128-127 short占2个字节,范围:-32768-32767 int占4个字节,范围:-2147483648-2147483647 long占8个字节,范围:-9223372036854775808-9223372036854775807浮点数类型double占8个字节 float占4个字节字…

今天学习和总结

学习了简单的算法知识排序中的快速排序,利用分治的思想来实现快速排序,对于前后大小有问题的进行swap的交换位置,这是基本的模版和源码 include using namespace std; define N 1000100 int A[N]; void quick_sort(int a,int b){ if(a>=b)return ; int i=a-1,j=b+1,x=A[a+b&…

代码整洁之道--读书笔记(7)

代码整洁之道简介: 本书是编程大师“Bob 大叔”40余年编程生涯的心得体会的总结,讲解要成为真正专业的程序员需要具备什么样的态度,需要遵循什么样的原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来者引路,助其职业生涯迈上更…

痞子衡嵌入式:在MDK开发环境下自定义安装与切换不同编译器版本的方法

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是在MDK开发环境下自定义安装与切换不同编译器版本的方法。Keil MDK 想必是嵌入式开发者最熟悉的工具之一了,自 2005 年 Arm 公司收购 Keil 公司之后,MDK 就走上了发展快车道,从 v2.50a 一路狂奔到现在最新的…