作业2

https://github.com/Mosya-CX/Mosya-CX/tree/master/3123004137

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

主要函数

  1. read_file
    • 功能:读取文件内容并返回字符串。
    • 输入:文件路径。
    • 输出:文件内容的字符串。
  2. split_utf8
    • 功能:将UTF-8编码的字符串分解为单个字符(支持多字节字符)。
    • 输入:UTF-8字符串。
    • 输出:分解后的字符列表(vector<string>)。
  3. get_codepoint
    • 功能:获取UTF-8字符的Unicode码点。
    • 输入:单个UTF-8字符。
    • 输出:字符的Unicode码点(uint32_t)。
  4. filter_chinese
    • 功能:过滤非汉字字符,仅保留汉字。
    • 输入:字符列表(vector<string>)。
    • 输出:仅包含汉字的字符列表(vector<string>)。
  5. lcs
    • 功能:计算两个字符列表的最长公共子序列(LCS)长度。
    • 输入:两个字符列表(vector<string>)。
    • 输出:LCS的长度(int)。
  6. main
    • 功能:程序入口,负责调用其他函数并完成查重逻辑。
    • 输入:命令行参数(原文文件路径、抄袭版文件路径、输出文件路径)。
    • 输出:将查重结果写入输出文件。

函数之间的关系

  1. main 函数
    • 调用 read_file 读取原文和抄袭版文件内容。
    • 调用 split_utf8 将文件内容分解为字符列表。
    • 调用 filter_chinese 过滤非汉字字符。
    • 调用 lcs 计算最长公共子序列长度。
    • 计算重复率并将结果写入输出文件。
  2. split_utf8get_codepoint
    • split_utf8 依赖 get_codepoint 来判断字符的字节长度。
    • filter_chinese 依赖 get_codepoint 来判断字符是否为汉字。
  3. lcs 函数
    • 是算法的核心,用于计算两个字符列表的相似度。

算法的关键点

  1. UTF-8 字符处理
    • UTF-8 是一种变长编码,字符可能占用 1 到 4 个字节。
    • split_utf8 函数通过检查字符的首字节来确定字符的长度,并将字符串正确分解为字符列表。
  2. 汉字过滤
    • 汉字的 Unicode 范围是 0x4E000x9FFF
    • filter_chinese 函数通过 get_codepoint 获取字符的 Unicode 码点,并过滤掉非汉字字符。
  3. 最长公共子序列(LCS)
    • LCS 是动态规划的经典问题,用于计算两个序列的最长公共部分。
    • 在本代码中,LCS 用于计算原文和抄袭版之间的相似度。
    • 使用滚动数组优化空间复杂度,将空间复杂度从 O(m*n) 降低到 O(n)。
  4. 重复率计算
    • 重复率公式:相似度 = (2 * LCS长度) / (原文长度 + 抄袭版长度) * 100%
    • 该公式考虑了原文和抄袭版的长度,能够更公平地反映相似度。
  5. 文件输入输出
    • 使用 ifstreamofstream 处理文件读写。
    • 支持从命令行参数指定文件路径,灵活性高。

改进:

1.正确处理中文字符,过滤非汉字内容,准确计算重复率。

2.支持文件错误处理,避免程序崩溃。

3.优化 LCS 算法的空间复杂度,减少内存占用。

4.通过命令行参数指定文件路径,适合实际应用场景。

5.模块化设计,代码逻辑清晰,易于扩展和维护。

测试原文:https://github.com/Mosya-CX/Mosya-CX/blob/master/3123004137/orig.txt
测试抄袭版1:https://github.com/Mosya-CX/Mosya-CX/blob/master/3123004137/orig_0.8_add.txt
测试结果:https://github.com/Mosya-CX/Mosya-CX/blob/master/3123004137/orig_0.8_add_result.txt
测试抄袭版2:https://github.com/Mosya-CX/Mosya-CX/blob/master/3123004137/orig_0.8_del.txt
测试结果:https://github.com/Mosya-CX/Mosya-CX/blob/master/3123004137/orig_0.8_del_result.txt
测试抄袭版3:https://github.com/Mosya-CX/Mosya-CX/blob/master/3123004137/orig_0.8_dis_1.txt
测试结果:https://github.com/Mosya-CX/Mosya-CX/blob/master/3123004137/orig_0.8_dis_1_result.txt
测试抄袭版4:https://github.com/Mosya-CX/Mosya-CX/blob/master/3123004137/orig_0.8_dis_10.txt
测试结果:https://github.com/Mosya-CX/Mosya-CX/blob/master/3123004137/orig_0.8_dis_10_result.txt
测试抄袭版5:https://github.com/Mosya-CX/Mosya-CX/blob/master/3123004137/orig_0.8_dis_15.txt
测试结果:https://github.com/Mosya-CX/Mosya-CX/blob/master/3123004137/orig_0.8_dis_15_result.txt
测试代码:.\论文查重算法\x64\Release\main.exe .\Mosya-CX\3123004137\orig.txt .\Mosya-CX\3123004137\orig_xxx.txt .\Mosya-CX\3123004137\orig_xxx_result.txt

输入错误样例:

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/join?id=CfDJ8KL9kPW-LSFBi_9YdTzcC08kUVVPB-v_5se4QgNYTtHhgXVD0f1B8EplikvHhDv2nB0o66FPxjpB8eiX04_5ZvXhhmTRGytCpJxbHm1_gajGsfksUhdc83GO6HHMehr1mS-UlM2RT-FImb_R80Y2oYI
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/homework/13324
这个作业的目标 设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率
posted @ 2025-03-05 13:01  莫思娅_Mosya  阅读(95)  评论(0)    收藏  举报