赫夫曼编码
2014-01-18 17:06
197 查看
#include "stdafx.h"
#include<vector>
#include<queue>
#include<iostream>
using namespace std;
class HaffmanNode
{
public:
HaffmanNode(int nKeyValue,HaffmanNode*pleft=NULL,HaffmanNode *pright=NULL)
{
m_nkeyvalue =nKeyValue;
m_pleft=pleft;
m_pright=pright;
}
public:
int m_nkeyvalue;
HaffmanNode *m_pleft;
HaffmanNode *m_pright;
};
struct cmp{
bool operator ()(HaffmanNode *a,HaffmanNode *b){
return a->m_nkeyvalue>b->m_nkeyvalue;//最小值优先
}
};
class HaffmanCoding
{
public :
typedef priority_queue<HaffmanNode*,vector<HaffmanNode*>,cmp> MinHeap;
typedef HaffmanNode* HaffmanTree;
HaffmanCoding(const vector<int> &weight):m_pTree(NULL)
{
m_stCount=weight.size();
for(size_t i=0;i<weight.size();i++)
{
m_minheap.push(new HaffmanNode(weight[i],NULL,NULL));
}
}
~HaffmanCoding()
{
_destroy(m_pTree);
}
void doHaffmanCoding ()
{
vector<int> vnCode(m_stCount-1) ;
constructtree () ;
traverse (m_pTree, 0, vnCode) ;
}
public:
void _destroy(HaffmanTree &ht)
{
if(ht->m_pleft!=NULL)
{
_destroy(ht->m_pleft);
}
if(ht->m_pright!=NULL)
{
_destroy(ht->m_pright);
}
if(ht->m_pleft==NULL&&ht->m_pright==NULL)
{
delete ht;
ht=NULL;
}
}
void traverse(HaffmanTree ht,int layers,vector<int> &vncode)
{
if(ht->m_pleft!=NULL)
{
vncode[layers]=0;
traverse(ht->m_pleft,++layers,vncode);
--layers;
}
if(ht->m_pright!=NULL)
{
vncode[layers]=1;
traverse(ht->m_pright,++layers,vncode);
--layers;
}
if(ht->m_pleft==NULL&&ht->m_pright==NULL)
{
cout<<ht->m_nkeyvalue<<"coding:";
for(int i=0;i<layers;++i)
{
cout<<vncode[i]<<" ";
}
cout<<endl;
}
}
void constructtree()
{
size_t i=1;
while(i<m_stCount)
{
HaffmanNode *lchild=m_minheap.top();
m_minheap.pop();
HaffmanNode *rchild=m_minheap.top();
m_minheap.pop();
HaffmanNode* pNewNode =new HaffmanNode(lchild->m_nkeyvalue+rchild->m_nkeyvalue,lchild,rchild);
m_minheap.push(pNewNode);
++i;
}
m_pTree =m_minheap.top();
m_minheap.pop();
}
private:
vector<int> m_vnWeight;
HaffmanTree m_pTree;
MinHeap m_minheap;
size_t m_stCount;
};
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> vnWeight ;
vnWeight.push_back (45) ;
vnWeight.push_back (13) ;
vnWeight.push_back (12) ;
vnWeight.push_back (16) ;
vnWeight.push_back (9) ;
vnWeight.push_back (5) ;
HaffmanCoding c(vnWeight);
c.doHaffmanCoding() ;
return 0;
}
#include<vector>
#include<queue>
#include<iostream>
using namespace std;
class HaffmanNode
{
public:
HaffmanNode(int nKeyValue,HaffmanNode*pleft=NULL,HaffmanNode *pright=NULL)
{
m_nkeyvalue =nKeyValue;
m_pleft=pleft;
m_pright=pright;
}
public:
int m_nkeyvalue;
HaffmanNode *m_pleft;
HaffmanNode *m_pright;
};
struct cmp{
bool operator ()(HaffmanNode *a,HaffmanNode *b){
return a->m_nkeyvalue>b->m_nkeyvalue;//最小值优先
}
};
class HaffmanCoding
{
public :
typedef priority_queue<HaffmanNode*,vector<HaffmanNode*>,cmp> MinHeap;
typedef HaffmanNode* HaffmanTree;
HaffmanCoding(const vector<int> &weight):m_pTree(NULL)
{
m_stCount=weight.size();
for(size_t i=0;i<weight.size();i++)
{
m_minheap.push(new HaffmanNode(weight[i],NULL,NULL));
}
}
~HaffmanCoding()
{
_destroy(m_pTree);
}
void doHaffmanCoding ()
{
vector<int> vnCode(m_stCount-1) ;
constructtree () ;
traverse (m_pTree, 0, vnCode) ;
}
public:
void _destroy(HaffmanTree &ht)
{
if(ht->m_pleft!=NULL)
{
_destroy(ht->m_pleft);
}
if(ht->m_pright!=NULL)
{
_destroy(ht->m_pright);
}
if(ht->m_pleft==NULL&&ht->m_pright==NULL)
{
delete ht;
ht=NULL;
}
}
void traverse(HaffmanTree ht,int layers,vector<int> &vncode)
{
if(ht->m_pleft!=NULL)
{
vncode[layers]=0;
traverse(ht->m_pleft,++layers,vncode);
--layers;
}
if(ht->m_pright!=NULL)
{
vncode[layers]=1;
traverse(ht->m_pright,++layers,vncode);
--layers;
}
if(ht->m_pleft==NULL&&ht->m_pright==NULL)
{
cout<<ht->m_nkeyvalue<<"coding:";
for(int i=0;i<layers;++i)
{
cout<<vncode[i]<<" ";
}
cout<<endl;
}
}
void constructtree()
{
size_t i=1;
while(i<m_stCount)
{
HaffmanNode *lchild=m_minheap.top();
m_minheap.pop();
HaffmanNode *rchild=m_minheap.top();
m_minheap.pop();
HaffmanNode* pNewNode =new HaffmanNode(lchild->m_nkeyvalue+rchild->m_nkeyvalue,lchild,rchild);
m_minheap.push(pNewNode);
++i;
}
m_pTree =m_minheap.top();
m_minheap.pop();
}
private:
vector<int> m_vnWeight;
HaffmanTree m_pTree;
MinHeap m_minheap;
size_t m_stCount;
};
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> vnWeight ;
vnWeight.push_back (45) ;
vnWeight.push_back (13) ;
vnWeight.push_back (12) ;
vnWeight.push_back (16) ;
vnWeight.push_back (9) ;
vnWeight.push_back (5) ;
HaffmanCoding c(vnWeight);
c.doHaffmanCoding() ;
return 0;
}
相关文章推荐
- 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形
- Fifa Ultimate Team Millionaire Trading Center - Launching Now!
- Yii Framework 开发教程(14) UI 组件 MaskedTextField示例
- sdut2164Binomial Coeffcients(组合数求模)
- Mac和Windows中常见中文字体的英文名称
- Cordova 3.3 开发环境搭建(视频)
- java学习笔记(一)
- XML
- Yii Framework 开发教程(13) UI 组件 ContentDecorator示例
- Yii Framework 开发教程(12) UI 组件 ClipWidget示例
- 百度开源编辑器内容获取与更改
- Linux命令详解之find
- Yii Framework 开发教程(11) UI 组件 ActiveForm示例
- LA2965字符串合并
- js取float型小数点后两位数的方法
- 多路查找树之2-3树的删除原理 - 数据结构和算法81
- UVALive2678子序列
- openerp修改logo和title
- android应用开发揭秘第13章01示例,移动图像,opengl绘制星星问题解决!
- Cocos2d-x 3.0 新特性体验(1)创建项目+运行sample+新特性内容