GitHub地址:https://github.com/DM-Star/WordCount-opt
作业需求:http://www.cnblogs.com/ningjing-zhiyuan/p/8654132.html
1、WordCount项目PSP表格:
PSP表格
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
Planning |
计划 |
5 | 5 |
· Estimate |
· 估计这个任务需要多少时间 |
5 | 5 |
Development |
开发 |
310 | 340 |
· Analysis |
· 需求分析 (包括学习新技术) |
30 | 30 |
· Design Spec |
· 生成设计文档 |
20 | 20 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
10 | 10 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
30 | 60 |
· Design |
· 具体设计 |
60 | 60 |
· Coding |
· 具体编码 |
90 | 60 |
· Code Review |
· 代码复审 |
10 | 10 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
60 | 90 |
Reporting |
报告 |
52 | 52 |
· Test Report |
· 测试报告 |
30 | 30 |
· Size Measurement |
· 计算工作量 |
2 | 2 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
20 | 20 |
合计 |
367 | 397 |
2、项目接口实现:
在这个部分,我一开始接的任务是状态转移,创建哈希函数,以及添加单词功能,但根据模块化的需要,后来添加单词的这部分还是由Star亲自出马解决。在这个项目里,要提高性能的话,就肯定不能不考虑数据结构就开始做,比如说,要看一个单词是否已经存在,不可能去从头开始找,找到了就词频加1,没找到就在后面再添一个新单词,设置词频是1。因为这样的开销是巨大的,在一个有几千几万个单词的文件中,无法想象要过多久才能统计出他的次数,显然和性能要求不符。
我一开始的反应是可以像字典一样弄一个首字母索引序列,但在和Star同学的交流中,我发现这样其实是不合理的,比方说a开头的单词有很多,但是例如v,x这些字母开头的单词实际上不是那么多,虽然实际上要根据当时的文件来看,但这种做法确实是不合理的。于是就想到了将单词所有字母的ASCLL码相加,并且模除一个数字,得到ASCLL码的下标,就相当于找到字典中的部首那样,通过这个下标去找到所有具有这个特征的单词,再处理词频,这样的话效率会高很多,后来我们为了程序处理方便选择模除128,这样的话这个算法只需要和127做 按位与 运算即可得到下标。
1 int WordList::Hash(char* word){ 2 int HashVal = 0; 3 4 while (*word != '