现在的位置: 首页 > 综合 > 正文

huffman学习

2014年10月18日 ⁄ 综合 ⁄ 共 2145字 ⁄ 字号 评论关闭


统计一篇文章中的char字符个数


void getFrequency(const string FileName,map<char,float>& StoreMap)
{
	string frequencyTable="f:\\frequency.txt";
	fstream writeFrequency(frequencyTable,ios::out|ios::trunc);
	fstream readFile(FileName,ios::in);
	if(!readFile)
	{
		cerr<<"error occur when open file :"<<FileName<<endl;
	}
	char c='\0'; int wordCount=0;
	while((c=readFile.get())!=EOF)
	{
		wordCount++;
		if(StoreMap.find(c)!=StoreMap.end())
		{
			StoreMap[c]+=1;
		}
		else
		{
			StoreMap.insert(map<char,float>::value_type(c,1));
		}
	}
	writeFrequency<<"total word : "<<wordCount<<endl;
	for(map<char,float>::iterator iter=StoreMap.begin();iter!=StoreMap.end();++iter)
	{
		cout<<iter->first<<" "<<iter->second<<" ";
		writeFrequency<<iter->first<<" "<<iter->second<<" ";
		iter->second=iter->second/wordCount;
		cout<<iter->second<<endl;
		writeFrequency<<iter->second<<endl;
	}
	writeFrequency.close();
	readFile.close();
}

bool buildTree(map<float,Node>&Article,Node *&head)
{
	
	if(Article.empty())
	{
		cerr<<"No arcticle input ! program is going to exit"<<endl;
		return false;
		exit(-1);
	}
	if(1==Article.size())
	{
		map<float,Node>::iterator iter=Article.begin();
		head=new Node((Node*)NULL,&iter->second,(Node *)NULL,'~');
		head->CharSum.push_back(iter->first);
		Article.erase(iter);
		return true;
	}
	while(1!=Article.size())
	{
		map<float,Node>::iterator iter=Article.begin();
		map<float,Node>::iterator iter2=Article.begin();
		iter2++;
		Node *p=new Node((Node*)NULL,&(iter->second),&(iter2->second),'~');
		float headValue=iter->first+iter2->first;
		p->CharSum.reserve(iter->second.CharSum.size()+iter2->second.CharSum.size());						//合并char费了很多时间
		p->CharSum.insert(p->CharSum.end(),iter->second.CharSum.begin(),iter->second.CharSum.end());
		p->CharSum.insert(p->CharSum.end(),iter2->second.CharSum.begin(),iter2->second.CharSum.end());
		iter->second.parent=p;
		iter2->second.parent=p;
		while (Article.find(headValue)!=Article.end())
		{
			headValue=headValue+0.000000001;
		}
		Article.insert(map<float,Node>::value_type(headValue,*p));  //加入新的节点
		head=p;	//一般老说我们不希望函数外面的饿指针指向函数内的成员变量,但是这里不是指向某个成员变量,而是发生赋值行为,这是head指向了堆中的某一个空间
		Article.erase(iter);//日,这里不能删除
		Article.erase(iter2);
	}
	return true;
}












vs2012快捷键

     ctrl+K+C 注释代码块

     ctrl+k+u  取消注释

参考


讲解文件操作: http://www.cnblogs.com/ifeiyun/articles/1573134.html

讲解map使用:http://www.cnblogs.com/JCSU/articles/1996876.html

抱歉!评论已关闭.