Huffman编码---C++

题目:电文字符集D及各个字符出现概率F如下:

 D={a,b,c,d,e,f,f,h}

 F= {5,29,7,8,14,23,3,11}

编写程序:打印D各字符的Huffman编码。

程序:

     Huffman.cpp文件

   

#include<iostream>
#include<vector>
#include<queue>
#include<string>
#include"huffam.h"

using namespace std;


int main()
{
 //测试string类型的数据,频率是出现设为概率


TreeNode<string> w[8];
   vector<TreeNode<string> > v1;
    w[0].frequrcy=5;
    w[0].ch="a";

    w[1].frequrcy=29;
    w[1].ch="b";

    w[2].frequrcy=7;
    w[2].ch="c";

    w[3].frequrcy=8;
    w[3].ch="d";

    w[4].frequrcy=14;
    w[4].ch="e";

    w[5].frequrcy=23;
    w[5].ch="f";

    w[6].frequrcy=3;
    w[6].ch="g";

    w[7].frequrcy=11;
    w[7].ch="h";

 copy(w,w+8,back_inserter(v1));
 TreeNode<string> re=huffman(v1);
 cout<<"编码的结果为"<<endl;
    printHufman(&re,"");
    cout<<endl;
    return 0;
}

 

            huffam.h文件

#include<iostream>
#include<vector>
#include<queue>
#include<string>
using namespace std;
/*************
本霍夫曼编码函数是用模板写成的】
可以对一些例如int型,char型,string型
进行基本的编码.
****************/

template<typename T>
struct TreeNode
{
 TreeNode()
 {
  lchild=rchild=0;
 }
 int frequrcy;
 T ch;
 TreeNode *lchild;
 TreeNode *rchild;

};

//改变优先队列默认优先级的重载运算符函数,重载为全局函数
template<typename T>
bool operator >(const TreeNode<T> & left,const TreeNode<T> &rigth)
{
 return (left.frequrcy>rigth.frequrcy);
}

template<typename T>
TreeNode<T> huffman(vector< TreeNode<T> > &c)
{
 size_t n=c.size();

 TreeNode<T> huffamNode;
    
 priority_queue<TreeNode<T>,vector<TreeNode<T> >,  greater<TreeNode<T> >  > q;

          //所有的结点插入优先队列中
         for(int i=0;i<static_cast<int>(n);i++)
                 {
      huffamNode=c[i];
      //huffamNode.lchild=huffamNode.rchild=0;
      q.push(huffamNode);

   }


    //核心代码,建树的过程
       for( i=0;i<static_cast<int>(n-1);i++)
    {
                     TreeNode<T> *tempNode=new TreeNode<T>;
      TreeNode<T> *xNode=new TreeNode<T>;
      TreeNode<T> *yNode=new TreeNode<T>;

       
        xNode->frequrcy=q.top().frequrcy;
        xNode->ch=q.top().ch;  
        xNode->lchild=q.top().lchild;
        xNode->rchild=q.top().rchild;      
         tempNode->lchild=xNode;       
         q.pop();

      yNode->frequrcy=q.top().frequrcy;
      yNode->ch=q.top().ch;
      yNode->lchild=q.top().lchild;
      yNode->rchild=q.top().rchild;          
         tempNode->rchild=yNode;
         q.pop();

      tempNode->frequrcy=xNode->frequrcy+yNode->frequrcy;
      q.push(*tempNode);      
    }
    return q.top();    
}

//输出编码的函数
template<typename T>
void printHufman(TreeNode<T> *root,string s)
{

 if(root->lchild!=0)
   printHufman(root->lchild,s+"0");
 if(root->rchild!=0)
   printHufman(root->rchild,s+"1");

 if(root->rchild==0&&root->lchild==0)
  cout<<"被编码对象"<<root->ch<<" "<<"频率"<<root->frequrcy<<" "<<"编码为"<<s<<endl;  
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值