这个作业属于哪个课程 软件工程
这个作业要求在哪里 个人项目
这个作业的目标 写一个程序实现文本相似度检测功能,学习用github等工具管理代码,学习使用工具分析代码,测试程序
GitHub地址 https://github.com/Tamakocode/3122004794

一.需求

题目:论文查重

描述如下:

设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。

原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:

从命令行参数给出:【论文原文的文件的绝对路径 】 【抄袭版论文的文件的绝对路径】 【输出的答案文件的绝对路径】

注意:答案文件中输出的答案为浮点型,精确到小数点后两位

二.计算模块接口的设计与实现过程

三.计算模块接口部分的性能

优化前:

优化后:

优化方法:

//优化前:
//最长公共子序列
    private static double calculateLongestCommonSubsequence(String text1, String text2) {
        int[][] dp = new int[text1.length() + 1][text2.length() + 1];  //二维dp

        // 动态规划计算最长公共子序列的长度
        for (int i = 1; i <= text1.length(); i++) {
            for (int j = 1; j <= text2.length(); j++) {
                if (text1.charAt(i - 1) == text2.charAt(j - 1)) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;   // 更新dp[j]为左上角的值加1
                } else {
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);  // 否则,取前一行或前一列的较大值
                }
            }
        }

        // 返回最长公共子序列长度
        return (double) dp[text1.length()][text2.length()] / Math.max(text1.length(), text2.length());
    }
//优化方法:每一步只需要使用到上一行和当前行的数据,所以我们只需要保留两行数据,这样就可以将二维数组优化成一维数组。
//最长公共子序列
    private static double calculateLongestCommonSubsequence(String text1, String text2) {

        int[] dp = new int[text2.length() + 1];

        for (int i = 1; i <= text1.length(); i++) {
            // 存储前一行的dp[j]的值以供后续使用
            int prev = dp[0];
            // 初始化当前行的dp[0]
            dp[0] = 0;
            
            for (int j = 1; j <= text2.length(); j++) {
                // 存储当前行的dp[j]的值以供后续使用
                int temp = dp[j];
                // 如果当前位置的字符匹配
                if (text1.charAt(i - 1) == text2.charAt(j - 1)) {
                    // 更新dp[j]为左上角的值加1
                    dp[j] = prev + 1;
                } else {
                    // 否则,取前一行或前一列的较大值
                    dp[j] = Math.max(dp[j], dp[j - 1]);
                }
                // 更新prev为当前行的dp[j]的值,供下次迭代使用
                prev = temp;
            }
        }

        // 返回最长公共子序列长度除以两个字符串长度的最大值
        return (double) dp[text2.length()] / Math.max(text1.length(), text2.length());
    }

四.计算模块部分单元测试展示

单元测试覆盖率:

五.计算模块部分异常处理说明

输入参数不足时,结束程序,并提示正确的参数命令

if (args.length < 3) {
            System.out.println("无效参数输入,正确命令为:java -jar 【PlagiarismChecker.jar的绝对路径】 original.txt plagiarized.txt output.txt");
            return;
}

六. PSP表格

PSP Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning · 计划 10 20
· Estimate · 估计这个任务需要多少时间 5 10
Development · 开发 180 200
· Analysis · 需求分析 (包括学习新技术) 30 50
· Design Spec · 生成设计文档 50 40
· Design Review · 设计复审 40 40
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 30 10
· Design · 具体设计 20 20
· Coding · 具体编码 50 60
· Code Review · 代码复审 20 20
· Test · 测试(自我测试,修改代码,提交修改) 20 30
Reporting · 报告 50 60
· Test Repor · 测试报告 20 40
· Size Measurement · 计算工作量 30 40
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 10 20
· 合计 565 700
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。