1.github链接
2.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 60 |
Estimate | 估计这个任务需要多少时间 | 50 | 60 |
Development | 开发 | 400 | 450 |
Analysis | 需求分析 (包括学习新技术) | 300 | 360 |
Design Spec | 生成设计文档 | 90 | 60 |
Design Review | 设计复审 | 90 | 60 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
Design | 具体设计 | 60 | 120 |
Coding | 具体编码 | 300 | 350 |
Code Review | 代码复审 | 60 | 90 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 90 |
Reporting Standard | 报告 | 60 | 40 |
Test Repor | 测试报告 | 60 | 40 |
Size Measurement | 计算工作量 | 20 | 10 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 40 |
合计 | 1670 | 1860 |
3.计算模块接口的设计与实现过程
(1) 解题思路及代码实现思路:
准备工作:用python的json库处理json文件,形成一个字典,这个字典是一级套着一级的,一开始存的是全国的所有省份,对某个省展开后就是这个省的所有市。因为这个字典的结构,所以这个算法的复杂度很低。
首先将难度等级分离,把前两个字符取出即可。利用逗号把姓名取出,取姓名用split函数,逗号前面的为姓名,后面的为要处理的地址。再利用python的正则库将电话号码取出,取出后将电话号码删除,这样我们只要给地址分级即可。
对于地址分级我们要从一级开始分级,然后依次分级到七级。分别为7个函数。
对于省级的匹配,遍历这个此时的字典,在字符串中寻找匹配。这里我用了find函数,下标从0开,方便后面的删除。匹配到后注意判断直辖市和自治区即可,自治区我用了一个映射来做,节约了代码量。找到将这些信息保存后在字符串中删除,因为后面要往下一级的匹配,所以匹配好了之后就可以删除这个省的信息,避免对下面的产生影响。匹配完之后将字典展开,这样下面一级才可以匹配。
二级三级四级思路和一级是一样的,由于三级和四级的后缀不大相同,所以我用了一个数组来保存后缀来匹配确定后缀。
对于后面5,6,7级的地址由于后缀不会缺省,所以直接正则匹配即可。
(2) 实现过程:
由于将功能几乎都封装在函数中,所以只要在main函数中依次调用这些函数即可。最后用一个字典保存输出即可。
(3) 独到之处:
json的数据字典是层次展开的,所以算法复杂度最多到10000次左右,所以成功将算法的速度瓶颈控制在对json文件的操作,所以速度会快一些。
4.计算模块接口部分的性能改进:
性能的瓶颈在input上,的确也是符合预期的,毕竟算法复杂度并不太高,为了一点的性能优化去写字符匹配算法比如kmp,自动机这些也是划不来的,也更容易秃头。实在要优化的话就可以上一些高级字符串匹配算法,可以在每次函数匹配时将性能得到优化。
5.计算模块部分单元测试展示:
输入:
2!李四,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层.
1!张三,福建福州闽13599622362侯县上街镇福州大学10#111.
2!王五,福建省福州市鼓楼18960221533区五一北路123号福州鼓楼医院.
1!小陈,广东省东莞市凤岗13965231525镇凤平路13号.
1!家基,江苏省连云港市赣榆区海头镇赣18828767011柘线盐仓城村村委会.
输出:
{"姓名": "李四", "手机": "13756899511", "地址": ["福建省", "福州市", "鼓楼区", "鼓西街道", "湖滨路", "110号", "湖滨大厦一层"]}
{"姓名": "张三", "手机": "13599622362", "地址": ["福建省", "福州市", "闽侯县", "上街镇", "福州大学10#111"]}
{"姓名": "王五", "手机": "18960221533", "地址": ["福建省", "福州市", "鼓楼区", "", "五一北路", "123号", "福州鼓楼医院"]}
{"姓名": "小陈", "手机": "13965231525", "地址": ["广东省", "东莞市", "", "凤岗镇", "凤平路13号"]}
{"姓名": "家基", "手机": "18828767011", "地址": ["江苏省", "连云港市", "赣榆区", "海头镇", "赣柘线盐仓城村村委会"]}
6.计算模块部分异常处理说明。
各个函数中都有捕获异常的机制,如果有异常则直接返回,不影响前后的代码逻辑
以分第三级地址为例
7.
花费时间见2
8.总结:
首先,这次的作业是真的难。花了我好久的时间,弄的我这一周别的事情几乎都没有做,甚至有点被生活压的喘不过气来,有点想跳楼哈哈哈。
一开始想用java,复习了java后发现太难写,也是听说评测难用。决定python,后来两个小时速成python基础语法,然后面向需求学习。还好有一些编程基础,前前后后花了一整天终于搞完代码,结果倒也还行。过了几天,感觉有bug,改了一下午结果又改回去了,真的是心态崩了,也怪自己没看清楚题目。
写博客的过程也是遇到各种未知科技,搞来搞去真的心态有点崩。
虽然这一周过的很痛苦,但是还是学到了很多东西,感觉自己又变强(tu)了。