个人作业2查重系统

news/2025/3/13 4:55:54/文章来源:https://www.cnblogs.com/jy-260017/p/18758672

查重系统

这个作业属于哪个课程 软件工程
这个作业要求在哪里 作业要求
这个作业的目标 初步使用PSP表格,完成一个文本查重系统

我的GitHub


PSP表格

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

一、计算模块接口的设计与实现

  1. 代码组织架构
    采用分层模块化设计,包含三大核心模块:

PaperCheck/
├── I/O模块(FileHandler)
│ ├── read_bytes() // 二进制读取文件
│ └── write_result() // 结果写入
├── 编码转换模块(UnicodeConverter)
│ └── utf8_to_codepoints() // UTF-8转Unicode码点
└── 算法模块(LCSCalculator)
└── lcs() // 动态规划计算LCS

  1. 关键函数流程图
    LCS计算函数流程图:

  2. 算法关键创新点
    ​多字节字符无损处理:将UTF-8字节流转换为Unicode码点序列,确保中文字符作为原子单位参与计算
    ​空间复杂度优化:使用滚动数组将空间复杂度从O(n²)降至O(n),可处理10万字级文本
    ​流式处理:支持逐块读取文件,避免大文件内存溢出

  3. 独到之处
    ​编码鲁棒性:通过状态机解析UTF-8,自动修复非法字节序列
    ​多粒度相似度:除整体重复率外,可扩展输出逐段匹配结果


二、计算模块性能改进

  1. 优化时间线
阶段 耗时 优化手段
初版 12h 基础动态规划实现
V1.1 3h 引入滚动数组
V1.2 2h SIMD指令加速码点比对
V1.3 1h 内存预分配策略
  1. 性能分析

  2. 关键优化手段
    ​滚动数组:将dp表从二维数组压缩为两个一维数组
    ​内存预分配:提前预留vector容量,避免动态扩容
    ​并行解码:使用OpenMP对多字节字符解码并行化


三、单元测试展示

  1. 测试用例设计
    测试数据构造策略:
    边界条件:空文件、单字符文件
    特殊字符:包含emoji、混合中英文
    压力测试:随机生成10万字文本

  2. 测试代码片段

点击查看代码
TEST(LCSModule, EmptyInput) {vector<uint32_t> s1;vector<uint32_t> s2{0x4ECA, 0x5929};ASSERT_EQ(lcs(s1, s2), 0);
}TEST(UnicodeConverter, IllegalUTF8) {vector<unsigned char> bytes{0xFF, 0x80}; // 非法序列auto result = utf8_to_codepoints(bytes);ASSERT_TRUE(result.empty());
}
  1. 覆盖率报告
模块名称 行覆盖率 分支覆盖率 函数覆盖率 备注
​FileHandler 98.2% 93.5% 100% 文件异常处理分支未完全覆盖
​UnicodeConverter 95.7% 89.1% 100% 非法UTF-8序列特殊处理分支未覆盖
​LCSCalculator 100% 100% 100% 核心算法完全覆盖
​ExceptionHandler 87.3% 82.4% 90% 内存溢出异常模拟未完成
​Main 76.5% - 100% 命令行参数校验分支未覆盖

四、异常处理说明

  1. 异常类型及设计目标
异常类型 触发条件 处理方式
FileIOException 文件不存在/无权限 终止程序并打印错误路径
EncodingException 非UTF-8编码 跳过非法字节并警告
MemoryOverflowException 超过2GB内存 终止并提示文件过大
  1. 单元测试样例
点击查看代码
TEST(ExceptionHandling, InvalidPath) {testing::internal::CaptureStderr();read_bytes("non_exist.txt");string output = testing::internal::GetCapturedStderr();EXPECT_TRUE(output.find("Error opening file") != string::npos);
}TEST(ExceptionHandling, LargeFile) {vector<uint32_t> s1(1e8, 0x41); // 4亿字节ASSERT_THROW(lcs(s1, s1), MemoryOverflowException);
}

五,测试实例



以下为与空白文档对比

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

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

相关文章

洛谷题单指南-图论之树-P3384 【模板】重链剖分/树链剖分

原题链接:https://www.luogu.com.cn/problem/P3384 题意解读:对树上某条最短路径(u到v的最短路径就是u-lca(u,v)-v)上的点修改(给每个点增加值)和查询(路径上所有点的和);对子树所有点修改(子树每个点增加值)和查询(子树所有点的和)。 解题思路: 暴力做法:路径修改和求和…

Kubernetes(K8S)内核优化常用参数详解

Kubernetes(K8S)内核优化常用参数详解小陈运维小陈运维,致力于运维技术博客文档分享。互相学习,相互进步。 2 人赞同了该文章 net.ipv4.tcp_keepalive_time=600 net.ipv4.tcp_keepalive_intvl=30 net.ipv4.tcp_keepalive_probes=10 net.ipv6.conf.all.disable_ipv6=1 net.…

北京大学DeepSeek系列教程:《DeepSeek与AIGC应用》

前言 今天大姚分享一个由北京大学推出的DeepSeek系列学习教程《DeepSeek与AIGC应用》,该文档全面介绍了DeepSeek-R1模型的技术特性、应用场景及其在AIGC领域的重要地位,同时深入剖析了AIGC的技术原理、应用价值、挑战及未来趋势,为听众提供了科学选择和使用AIGC工具的指导。…

fastadmin使用宝塔管理面板swoole4创建websocket服务并开启wss支持(改良可用)

1、安装swoole插件 我php的版本是7.4, Swoole4. 2、安装think-swoole 在网站站点根目录下运行composer require topthink/think-swoole:2.0.0特殊情况可强制安装composer require topthink/think-swoole:2.0.0 --ignore-platform-reqs 3、修改伪静态,加入代码location /wss …

均线实战精华:银山谷、金山谷、死亡谷,千万别小看,准确率极高

我们平常所说的“均线”,指的是移动平均线,即指定一个时间周期,将每日收盘价相加,除以这个周期,就得出该周期的平均价,用线将这些点连接,得到一条线。可以理解为周期内投资者买入股票的平均成本。 移动平均线的出现,对股票分析的“可视化”,贡献极大。自上世纪60年代,…

SciTech-EECS-Circuits-Power Electrics(功率器件): 电弧/电焊/电解/电铍:大功率 的 电流 时问+波形 的 数控脉冲放电 实现

SciTech-EECS-Circuits-Power Electrics(功率器件): 电弧/电焊/电解/电铍:大功率 的 电流 时问+波形 的 数控脉冲放电 实现 电焊 原理上是调制 高压大功率 电弧 熔接 焊条+工件; 但实际上,保障高质量、优异的焊接效果 和 超出客户预期 的满意度, 还要有“吸取众长、推陈出新”…

2.2.1 读取数据集

这里还要用pandas读取数据集,是因为这里是结构化数据,无论是统计学习还是深度学习,结构化数据使用pandas读入肯定是好的,下面两个概念(结构化数据和非结构化数据)就可以记一下了

手机端的增

这是javaweb版本的增: 测试内容:代码结构:model层: package model;public class Course {private int id;private String courseName;private String teacher;private String location;public Course() {}public Course(int id, String courseName, String teacher, String …

Java线程池中的线程何时被销毁

线程池中的线程是否会被销毁,取决于线程池的配置和运行状态。以下是详细解释:1. 线程池中线程的生命周期 线程池中的线程在以下情况下可能会被销毁:空闲线程超时:如果线程池允许核心线程超时(通过 allowCoreThreadTimeOut(true) 设置),当线程空闲时间超过 keepAliveTime…

newyear WriteUp

WriteUp 题目信息 名称:newyear.exe 分类:Reverse 描述:找到程序的flag题目链接: https://pan.baidu.com/s/1u8bGbKcUF6_gLaw63L3jyA?pwd=h8r5 提取码: h8r5解题思路 首先使用DIE对文件查壳,发现该文件具有压缩壳upx,所以使用对应脱壳工具对其进行脱壳。脱壳结果如下:若…

学习进度条3.7

所花时间:7小时 代码量:200 搏客量:1 了解到的知识点: 1.条件概率公式:P(A|B)=P(AB)/p(B) 2.乘法公式:P(AB)=P(A)P(B|A)=P(B)P(A|B) 3.全概率公式: n P(A)= ∑ P(A∣Bi)P(Bi) i=1 4.贝叶斯公式:​