上一篇博客还是很久以前的了,虽然博客也是很好的学习方式,但比较懒~这次是老师的要求的作业,恩,废话少说了。
一、程序说明及结果
采用的是c++编写的代码,对于读取的单词采用的双向链表的结构存储(方便对节点排序),由于要输出频率最高的十个单词,就意味着要对链表排序。在实现上,我是在每读入一个单词时并对链表的序列进行更新,将复杂度控制在了O(n)。
程序结果(其中文本文件大小为259KB):
二、performance analysis tool分析结果
1、分析结果,可以看出运行时间约为6秒钟,以及各个时段的cpu使用率。
2、下面再仔细的看看每个部分所花的时间,在上图的“当前视图"右边可以往下拉,找到函数一项,点击:
3、分析具体的函数的每一部分消耗,如Wordcount::redFile():
并可定位至相应代码:
三、源码
1、头文件
#ifndef HEAD_H
#define HEAD_H
#include<string>
#include<iostream>
#include<fstream>
using namespace std;
//用于存储读入单词的链表结构
struct Word{
int count;
string w;
Word * next;
Word * par;
};
class Wordcount{
private:
Word * ptr;
public:
Wordcount();
~Wordcount(){};
void readFile();
void reaultOut();
void update(Word * pn);
};
#endif
2、实现文件
#include "head.h"
Wordcount::Wordcount(){
ptr = NULL;
}
void Wordcount::readFile(){
ifstream in;
in.open("data.txt", ios::in);
if (!in)
return;
string str = "";
Word * p, *pre;
char ch;
while (!in.eof()){
in.get(ch);
if (ch == ' ' || ch == 10)
continue;
if (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z'))
{
while (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')){
if ('A' <= ch && ch <= 'Z')
ch += 32;
str += ch;
if (!in.eof())
in.get(ch);
else
return;
}
///
//一个单词结束
Word * wtemp = new Word;;
wtemp->count = 1;
wtemp->w = str;
wtemp->next = NULL;
wtemp->par = NULL;
str = "";
//若为第一个单词
if (ptr == NULL){
ptr = wtemp;
}
else{
//与前面的单词比较
p = pre = ptr;
while (p){
pre = p;
if (p->w == wtemp->w){
p->count++;
//更新链表
update(p);
break;
}
else
p = p->next;
}
//当前单词不存在时
if (!p){
pre->next = wtemp;
wtemp->par = pre;
}
}
}
}
in.close();
}
//更新链表的排序
void Wordcount::update(Word * pn){
Word * p = NULL;
Word * q = NULL;
if (pn != ptr)
while ((pn->par != NULL) && (pn->count > pn->par->count)){
//如果与头结点交换,需更新ptr指针,即头指针
if (pn->par == ptr)
ptr = pn;
p = pn->next;
q = pn->par;
///注意双链表共有6个节点需要更新
//更新当前节点的下一节点的par指针,注意判断其是否为空
if (pn->next)
pn->next->par = pn->par;
pn->next = pn->par;
pn->par = pn->par->par;
if (q->par)
q->par->next = pn;
q->par = pn;///
q->next = p;
}
}
void Wordcount::reaultOut(){
int i;
Word * p = ptr;
if (p != NULL){
for (i = 0; i < 10 && p; i++){
cout << p->w << " " << p->count << endl;
p = p->next;
}
}
}
#include "head.h"
void main()
{
Wordcount test;
test.readFile();
test.reaultOut();
}
四、总结
首先学习了一个新的代码分析工具,这只算是了解了,希望以后多加使用探索,使真正能改进程序性能。
代码还有很多可以改进的地方,也肯定会有很多的bug,不吝赐教!