• 第一次个人编程作业


    软件工程 软件工程
    作业要求 作业要求
    作业目标 论文查重算法设计、PSP表格设计、单元测试、性能测试、Git上传文件

    一.github链接:https://github.com/deerc123/learngit

    二.PSP

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

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

    1.算法原理
    最小编辑距离算法计算文本相似度:
    Levenshtein Distance 算法,又叫 Edit Distance 算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。
    许可的编辑操作包括:替换一个字符;
    插入一个字符;
    删除一个字符。
    例如字符串learn和mean可以通过“替换”和“删除”来实现目的,所以它们的最小编辑距离为2。

    用edit[i][j]表示A串和B串的编辑距离。edit[i][j]表示A串从第0个字符开始到第i个字符和B串从第0个字符开始到第j个字符,这两个字串的编辑距离。字符串的下标从1开始。
    dis[0][0]表示word1和word2都为空的时候,此时他们的Edit Distance为0。很明显可以得出的,dis[0][j]就是word1为空,word2长度为j的情况,此时他们的Edit Distance为j,也就是从空,添加j个字符转换成word2的最小Edit Distance为j;同理dis[i][0]就是,word1长度为i,word2为空时,word1需要删除i个字符才能转换成空,所以转换成word2的最小Edit Distance为i。
    则从上面的分析,不难推导出动态规划方程:

    上式中的min()函数中的三个部分,对应三种字符操作方式:
    edit[i-1][j]+1相当于给word2的最后插入了word1的最后的字符,插入操作使得edit+1,之后计算edit[i-1][j];
    edit[i][j-1]+1相当于将word2的最后字符删除,删除操作edit+1,之后计算edit[i][j-1];
    edit[i-1][j-1]+flag相当于通过将word2的最后一个字符替换为word1的最后一个字符。flag标记替换的有效次数。

    2.总流程
    (1)main函数:输入原文件和对比文件——>读取文件——>将文件文本转换为String——>调用CompareStrSimUtil函数;
    (2)CompareStrSimUtil函数:构建矩阵并计算最小编辑距离,将所得的相似度百分比结果返回。
    3.主要函数
    (流程图)

    (代码)

    4.cmd运行结果:

    四.计算模块接口部分的性能改进

    1.所有对象内存分配情况

    2.所有方法消耗时间占比情况


    由图可得,compare方法耗时占比最多。

    3.运行时间

    1.0s<5s,运行时间合理。
    4.代码改进:
    改进前(代码):

    改进后(代码):

    在main函数里添加了去除文本标点符号的代码操作,先将StringBuilder转化为String,然后调用String的正则表达式方法,提升了文本相似度的正确性。

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

    单元测试

    测试运行耗时

    测试代码覆盖率

    个人总结

    (1)在这次个人项目中,我一开始并没有很早去准备,在拖延了几天后才着手去准备这次个人项目,导致后面的每天都耗费了大量时间在个人项目上,且完成得很草率,还有很多可以完善的点并没有很好地完成,在时间观念上对项目设计有了更为清晰的认知。
    (2)这次个人项目也让我不由地赞叹Git的功能之强大,我也学习到了一些软件设计的小知识,并且初步了解了JProfiler、Git等软件,并且对老师课上所讲述的单元测试和性能测试有了更为客观的了解。
    (3)PSP表格确实提高了软工项目设计的总效率,让我更直观地把握了设计前后的时间分配。

  • 相关阅读:
    MyBatis配置文件(四)--typeHandlers
    MyBatis配置文件(三)--typeAliases别名
    理解JWT的使用场景和优劣
    JWT的使用流程
    JWT (JSON WEB Token)正确使用场景
    转 Spring Security 简介
    转 Solr vs. Elasticsearch谁是开源搜索引擎王者
    Oauth2.0(一):为什么需要 Oauth2.0 协议?
    Spring Security 与 OAuth2(介绍)
    理解OAuth 2.0
  • 原文地址:https://www.cnblogs.com/deerc123/p/13712986.html
Copyright © 2020-2023  润新知