第一次个人编程作业
个人仓库:[(https://github.com/kuliangce/031702643.git)]
PART1: PSP(Personal Software Process)表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 15 | 30 |
Estimate | 估计这个任务需要多少时间 | 1100 | 2115 |
Developm | 开发 | 400 | 400 |
Analysis | 需求分析(包括学习新技术) | 100 | 300 |
Design Spec | 生成设计文档 | 30 | 30 |
Design Review | 设计复审 | 10 | 10 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 5 | 5 |
Design | 具体设计 | 40 | 100 |
Coding | 具体编码 | 120 | 500 |
Code Review | 代码复审 | 10 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 120 | 120 |
Reporting | 报告 | 60 | 60 |
Test Report | 测试报告 | 10 | 10 |
Size Measurement | 计算工作量 | 30 | 30 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 30 | 30 |
合计 | 1100 | 1715 |
PART2: 代码的设计与实践
(1)如何解决这回的问题?
这一次的问题可以说是一道字符匹配问题,不过这道题因为部分地名的缺失和地名后缀的省略使得这道题的难度提高。首先提到的就是前四级的地址匹配,可以注意到的是因为后缀可能省略我们不能那全名来进行匹配,那我们就去爬一份只有地名没有地名后缀的json文件,将文件内容递归处理后可以得到一颗以0为根节点的树,除了0号节点外每一个节点存储地名和行政区划代码,再使用链式前向星存储父亲指向儿子的边,只要有一个节点是确定的就可以对该结点的每个儿子节点进行匹配。除了匹配问题以外我们还需要注意一下文件输入输出格式。
(2)使用什么算法或数据结构?
就如之前提到的那样在数据结构上我选择了树,而在算法上我除了使用了链式前向星作为存边建边的算法外,我还使用了KMP作为匹配算法来加快程序在每一个节点上的字符串匹配速度。在这里就不将KMP算法的原理了有兴趣的请自行了解。
(3)代码如何实现?
我是这次是多文件编程,我的代码总共有由division、pretreatment、print和utf-8四个部分来解决问题我这里就来提一下它们的作用。首先是pretreatment,在这里面是我根据爬来的json文件的有规律的排版,额外写了一个程序将建树所需要的数据全部处理完成后生成的,它是我作者提的基础。其次是utf-8,因为我使用的是C++作为我的编程语言,而汉字由于其特殊的编码方式不支持C++的默认字符编码格式,所以转码成为了我要解决的第一个问题,utf-8的作用就是将输入进来的字符串进行处理最后返回宽字符串。然后是division,它是我处理字符串的主要部分,主要作用有对于输入的字符串进行人名和电话号码的处理,对四级地址的匹配,基于KMP算法对字符串的匹配。最后是print,这部分主要是将四级地点的名称与它们的后缀合并最后进行输出。因此我代码的运行过程可以概括为调用pretreatment预处理建树,调用utf-8编码输入,调用division对地址进行分级处理,最后调用print进行地址与地址后缀的合并和输出。
PART3:异常处理说明
关于这回异常处理说明主要有三点,一点是最开始输入时发现输入文件乱码,后来通过convert库中的函数将utf-8改为gbkj进行输入。其次是之后进行字符串匹配时出现了因特判时数组越界的情况,后来我通过边处理字符串边用后面的字符覆盖前面的字符多出来的空间补零的方式缩短右边界的方式解决了问题。第三是样例中有时候会出现某些等级地址的缺失,这个时候就无法直接一级一级的匹配,我这里就使用深搜实现更多级数的匹配,可以解决一部分难度为3的问题,我这里贴出我的代码。
PART4:性能分析
已用独占时间最长的函数
大体性能图
上面这张图的函数里我的程序总执行时间为0.221s 独占时间最长的函数为我输出时转码utf-8所用的函数。暂时没有较好的改进方法。
PART5:单元测试
样例
1!黎剖奕,13614572468广东省珠海市金湾区三灶镇乐康街一巷11号三灶镇海澄村委会.
1!荣户掂,天津市13708570358河东区春华街道华腾里9号楼.
2!寿佳,湖南益阳市赫山区龙岭工业园13221817716春嘉路6号.
输出
{"姓名":"黎剖奕","手机":"13614572468","地址":["广东省","珠海市","金湾区","三灶镇","乐康街一巷11号三灶镇海澄村委会"]}
{"姓名":"荣户掂","手机":"13708570358","地址":["天津","天津市","河东区","春华街道","华腾里9号楼"]}
{"姓名":"寿佳","手机":"13221817716","地址":["湖南省","益阳市","赫山区","龙岭工业园","春嘉路","6号",""]}