单词频度统计

1)

经过一天的思考,写下了这篇设计报告。
在开始写项目之前,我进行了大量的查阅与测试,主要是与C++语言有关的用法,虽然之前学过,但是没有上机的经验,所以用起来会生疏。
其次就是算法的设计,统计单词频度不难,用map就可以,但是要统计词组就麻烦了,虽然可以套用统计词频的方法,但是占用的存储空间和时间代价将会非常巨大,因为只要求统计出现最频繁的前十个词组。所以,需要进行一些优化,我的优化方法就是提前淘汰一些词组。具体的就是建立一个按出现次数降序的有序集合,每次添加一个新的词组时,先把检查该词组中的2(或3)个单词词频的最小值minFreq与集合中排在第10的词组的出现次数tenthFreq作比较,如果minFreq<tenthFreq那么说明新找到的词组(该词组出现次数targetFreq<minFreq)一定不是最频繁出现的10个词组。
该项目分为以下子过程,括号中的时间是假设在熟练掌握了C/C++的基础上需要的时间。
1.遍历给定目录,返回符合要求的文本文件的绝对路径的string数组(10m)18
_findFirst
_findNext
2.获取单词,建立词频统计map(20m)17
ifstream+getline顺序读取每个文本文件中的每一行
map统计词频,vector<pair>实现按词频排序
3.获取词组,建立词组对应出现次数的有序集合(60m)120
pair+list
4.main函数(30m)
各子过程组装成完整的程序
5.测试与调试(120m)
构造10个测试用例
6.performance analysis (60m)

2)

各个功能模块实际用时
1.遍历目录:18m
2.获取单词,建立词频统计map:17m
3.获取词组,建立词组对应出现次数的有序集合120m(未实现)

各子过程组装成完整的程序60m
由于统计词组的设计不当,浪费了大量时间,最后还是用了与统计单词相同的方式

测试与调试:1天
在测试的时候又不断调整算法,并且C++的某些类使用有误,所以用了很长的时间
构造10个测试用例

performance analysis (2小时)

3)

直接上图,统计VS11安装目录下的Common7的情况

第一版分析结果见下图,简直是弱爆了

如果没有性能分析的功能,我完全不知道瓶颈竟然是在正则表达式上,看图

于是我自己写了一个读取单词的类,结果快了不止一个数量级,第二版分析如下

瓶颈被我搞定了

但是add还可以再优化一下,我用的是C++中的map,map采用红黑树的结构,而不是更快速的哈希,所以没有什么提高的空间了。

4)

时间紧,我用了别人所有的测试用例。

以后再补充啦

5)

收获很大

一是得到了用C++语言写项目的练习,虽然学了一学期的C++,但是都没有怎么编程,很多理论的东西全忘了,学一门语言最好的方式就是动手自己写。

二是对VS的使用更加熟练了,我从大一上就一直使用VS,但直到现在才知道性能分析怎么用,相信还有很多强大的功能等待着我去发掘。

 

当然我在这次项目也记录了遇到的诸多问题。

问题1
类型A包含一个regex成员r,如何在构造函数中根据传入的string参数s构造一个r
目前的做法是赋值:
regex temp(s);
r=temp;
问题2
A类的对象需要调用B类的某个方法
目前的做法是赋值:将B类对象的引用作为A类的成员,并在调用A类的构造函数时传递一个B类对象进来
问题3
头文件中不可以定义函数?出现重定义的错误
问题4
调试时输出一些提示信息,调试后批量注释这些输出语句,有没有什么宏可以实现这样的功能

posted @ 2014-09-25 18:40  Asoka_the_Great  阅读(611)  评论(1编辑  收藏  举报