赫夫曼编码
来源:互联网 发布:华丽上班族电影知乎 编辑:程序博客网 时间:2024/05/16 15:42
#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;
}
0 0
- 赫夫曼编码
- 赫夫曼编码
- 赫夫曼编码
- 赫夫曼编码
- 赫夫曼编码
- 赫夫曼编码!
- 赫夫曼编码
- 赫夫曼编码
- 赫夫曼编码
- 赫夫曼编码
- 赫夫曼编码
- 赫夫曼编码
- 赫夫曼编码
- 赫夫曼编码
- 赫夫曼编码
- 赫夫曼编码
- 赫夫曼编码
- 赫夫曼编码
- Linux命令详解之find
- 百度开源编辑器内容获取与更改
- Yii Framework 开发教程(11) UI 组件 ActiveForm示例
- C语言中的双向循环链表
- Yii Framework 开发教程(12) UI 组件 ClipWidget示例
- 赫夫曼编码
- 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形
- Yii Framework 开发教程(13) UI 组件 ContentDecorator示例
- IOS 发送邮件
- Yii Framework 开发教程(14) UI 组件 MaskedTextField示例
- IOS学习笔记——UITableView(一)
- Yii Framework 开发教程(15) UI 组件 MultiFileUpload示例
- SQL经典18题(不知道经不经典)
- i++ 和 ++i 效率的分析以及自定义类型的自增/自减运算符重载实例