[https://github.com/ycwwwwww/031902128]:

一、PSP表格

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

二、计算模块接口

2.1、计算模块接口的设计与实现过程

2.1.1 概述

查阅资料看到偏向算法的方法有DFA算法和AC自动机,权衡性价比及效率问题,选择了DFA算法。

2.1.2 DFA算法

DFA算法的核心是构造一颗多叉树,根据输入在该树中可以非常高效的查找。

设输入的字符串为:黄某你是憨批哈哈哈

我们遍历输入的字符串 str,并设指针 i 指向树状结构的根节点,即最左边的空白节点:
str[0] = ‘黄’ 时,此时 tree[i] 没有指向值为 ‘黄’ 的节点,所以不满足匹配条件,继续往下遍历
str[1] = ‘某’,同样不满足匹配条件,继续遍历
str[2] = ‘你’,此时 tree[i] 有一条路径连接着 ‘我’ 这个节点,满足匹配条件,i 指向 ‘你’ 这个节点,然后继续遍历
str[3] = ‘是’,此时 tree[i] 有一条路径连着 ‘是’ 这个节点,满足匹配条件,i 指向 ‘爱’,继续遍历
str[4] = ‘憨’,同样有路径,i 指向 ‘憨’,继续遍历
str[5] = ‘批’,同样有路径,i 指向 ‘批’
此时,我们的指针 i 已经指向了树状结构的末尾,即此时已经完成了一次敏感词判断。我们可以用变量来记录下这次敏感词匹配开始时玩家输入字符串的下标,和匹配结束时的下标,然后再遍历一次将字符替换为 * 即可。
结束一次匹配后,我们把指针 i 重新指向树状结构的根节点处。
此时我们玩家输入的字符串还没有遍历到头,所以继续遍历:
str[6] = ‘哈’,不满足匹配条件,继续遍历
str[7] = ‘哈’ …
str[8] = ‘哈’ …

DFA初始化构造的代码

private Hashtable map;
private void InitFilter(List<string> words)
{
    map = new Hashtable(words.Count);
    for (int i = 0; i < words.Count; i++)
    {
        string word = words[i];
        Hashtable indexMap = map;
        for (int j = 0; j < word.Length; j++)
        {
            char c = word[j];
            if (indexMap.ContainsKey(c))
            {
                indexMap = (Hashtable)indexMap[c];
            }
            else
            { 
                Hashtable newMap = new Hashtable();
                newMap.Add("IsEnd", 0);
                indexMap.Add(c, newMap);
                indexMap = newMap;
            }
            if (j == word.Length - 1)
            {
                if (indexMap.ContainsKey("IsEnd")) indexMap["IsEnd"] = 1;
                else indexMap.Add("IsEnd", 1);
            }
        }
    }
}

2.2、计算模块接口部分的性能改进

显然String类开销最大

改进思路:使用正则表达式减少判断的复杂度使用hashmap提高查询速度。

2.3、计算模块部分单元测试展示

只能尽可能多的把可能出现的情况列举出来,提高代码覆盖率,能力限制,不能全部完成。还有需要多测试几次,因为产生的符号数据都是随机的,尽可能降低偶然性。

2.4、计算模块部分异常处理说明

1、result.txt文件创建失败

创建result.txt,将内容写入到result.txt过程中,出现异常进行捕获,并提示用户result.txt创建失败。

1    public void creatFile() throws Exception {
2        CreatFile creatFile = new CreatFile();
3         creatFile.creatFile(10,1,100,4,1,1);
4     }

2、输入参数异常

当输入不符合要求的参数时,程序可以捕获该异常,给出反馈,标示出错误出现在哪,提示重新输入参数。

1		public void mTest() throws Exception {
2         IsRight  isRight = new IsRight();
3         String s1[]={ "-n","12", "-m","1","rrrr"};
4         String s4[]={ "-n","12", "-m","ww","100"};
5         System.out.print(isRight.mTest(s1));
6         System.out.print(isRight.mTest(s4));
7     }

三、心得

大部分时候是有思路但是没操作,自身的代码水平太低了在熟练掌握代码之后再进行此类操作也许可以更加得心应手。

posted on 2021-09-23 22:05  Ycwwww  阅读(57)  评论(0编辑  收藏  举报