第一次个人作业代码实现以及优化

 

 
第一次个人作业代码实现以及优化

PB15151793 陈灿


 

代码实现过程

  • 数据结构
    1. 自定义结构体strint
struct strint
{
  string str;
  int fre;
  strint()
  {
      str = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";;
      fre = 0;
  }
  strint(string str0, int fre0)
  {
      str = str0;
      fre = fre0;
  }
};

bool operator < (const strint n1, const strint n2)
{
  if (n1.fre > n2.fre)
      return true;
  else if (n1.fre < n2.fre)
      return false;
  else
      return n1.str > n2.str;
}

存储对应str的出现频率;并且定义"<"运算符,方便找出出现频率最高的10个单词和词组。
2. unordered_map
对于词组,用unordered_map<string, int> Phrasefre来存储;对于单词,用unordered_map<string, strint> Wordfre来存储。具体细节上篇文章已经写得很清楚了。
3. priority_queue
一开始初始化队列中有10个元素,对于接下来出现的元素,如果出现的频率大于队列中出现频率最小的元素,就替换它。由于优先队列是采用堆排序的思想,所以时间复杂度为O(NlgK),而如果直接维护一个10个元素的数组,时间复杂度为O(NK).
具体代码实现过程,请看github的源码,这里就不赘述了。

 

性能分析以及优化

  • 一开始写这个project的时候,为了增加程序可读性,写了很多接口封装,后来知道频繁调用函数会导致CPU流的中断。于是把调用的大部分函数,展开放在main里面,程序运行时间减少了一半。
  • 查看热行,发现string的拼接操作占用时间比例很大。我使用的是str = str1 + str2的形式,后来翻看一些博客得知:类似str =str+ "a"加的运算产生的是一个新的对象,再把结果返回,而str += "a" 涉及到的应该是对象的引用,操作之后直接返回引用,避免了产生新的对象。因此,两者的性能有一定的差距。将相应代码修改后,性能获得显著提升;
 

测试用例设计和分析过程

采用白盒测试用例设计方法来设计测试用例,设计10个测试用例,确保我的程序能够正确处理各种情况。这里引用《移山之道 》中测试样例的要求:

单元测试应该在最低的功能/参数上验证程序的正确性 单元测试必须由最熟悉代码的人(程序的作者)来写。 单元测试过后,机器状态保持不变。
单元测试要快(一个测试运行时间是几秒钟,而不是几分钟)。 单元测试应该产生可重复、一致的结果。
独立性,单元测试的运行/通过/失败不依赖于别的测试,可以人为构造数据,以保持单元测试的独立性。
单元测试应该覆盖所有代码路径,包括错误处理路径,为了保证单元测试的代码覆盖率,单元测试必须测试公开的和私有的函数/方法。
单元测试应该集成到自动测试的框架中。 单元测试必须和产品代码一起保存和维护。

我在设计样例时考虑了空文件,含中文字符文件,图片文件等等各种可能的情况,测试结果正常。

 其中一个测试样例(我最喜欢的叶芝的诗歌,其他测试样例限于篇幅这里就不列出来了):

When you are old and grey and full of sleep, 迟暮染霜兮,恹恹梦醺人,
And nodding by the fire, take down this book, 小憩围炉兮,信手览诗册,
And slowly read, and dream of the soft look
缓阅章句兮,柔柔目中光,
Your eyes had once, and of their shadows deep;
How many loved your moments of glad grace,
And loved your beauty with love false or true,
But one man loved the pilgrim soul in you,
And loved the sorrows of your changing f@@ace;
And bending down beside the glowing bars,
Murmur, a little sadly, how Love fled
And paced upon the mountaidafdjak#######ns overhead
And hid his face amid a crowd of stars.

 

测试结果正常:

char_number : 609
line_number : 13
word_number : 59

loved: 4
Your: 4
down: 2
Love: 2
with: 1
upon: 1
true: 1
this: 1
their: 1
take: 1

loved Your :2
with Love :1
upon mountaidafdjak :1
true loved :1
this book :1
their shadows :1
take down :1
soul loved :1
sorrows Your :1
soft look :1

项目经验

完成这次项目,我学到的最重要的东西就是了解了一个完整的软件开发流程,由前期的需求分析,代码计划第一大部分,到实战编程第二大部分,到最后测试分析第三大部分。每部分需要注意的细节,都在这次实战过程中,被我了解得很清楚。其中,感觉最“玄学”的地方就是代码移植,从windows到Linus系统的移植过程中,真地会出现很多意想不到的错误,中文字符的乱码只是很常见的错误了,其他被我解决各种玄学错误,我现在都不知道一部分错在哪儿。

 

posted @ 2018-03-30 09:32  eeom  阅读(270)  评论(5编辑  收藏  举报