您的位置:首页 > 其它

赫夫曼编码

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: