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