• 单词频度统计


    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
    调试时输出一些提示信息,调试后批量注释这些输出语句,有没有什么宏可以实现这样的功能

  • 相关阅读:
    提权函数之RtlAdjustPrivilege()
    用C#写外挂或辅助工具必须要的WindowsAPI
    ASP.net中保持页面中滚动条状态
    asp.net窗体的打开和关闭
    界面原型设计工具 Balsamiq Mockups
    在List(T)中查找数据的两种方法
    P2158 [SDOI2008]仪仗队 题解
    P1531 I Hate It 题解
    C#
    破解网站防盗链
  • 原文地址:https://www.cnblogs.com/yxr1993/p/3993443.html
Copyright © 2020-2023  润新知