记信息论与编码之课设-哈夫曼编码

 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式, 

夫曼编码是可变字长编码(VLC)的一种。Huffman1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)

   首先,将符号按照概率由大到小排队编码时,从最小概率的两个符号开始,可选其中一个支 路为0,另一支路为1。这里,我们选上支路为0,下支路为1。再将已编码的两支路的概率合并,并重新排队。多次重复使用上述方法直至合并概率归一时为止   

 从文件中或者输入 读入一个字符串,统计字符串中的字符种类(不包括大小写),以及每个字符出现的概率,并按照霍夫曼编程思想,构造哈夫曼树结构,将其转化成01”的二进制字符串,并且可以读入一串01字符串,将其译为对应的哈夫曼字符。并计算其编码效率。

基本算法:

①  输入字符串 (不包含大小写),回车结束

     ②  根据循环遍历统计字符串中每个不同字符的概率以及总个数

     ③  根据哈夫曼编码构造哈夫曼树

         先将数组排序,采用优先队列求出最小的两个概率,求和得到父节点 ,加入哈夫曼树数组中,依次循环直到只剩下一个概率且为1的根节点

      ④  编码,从每个叶子节点向根遍历,如果是左子树编码就为0,右子树为1.直到所有的叶子节点都编码完毕。

      ⑤   根据公式求编码效率n == H(s)/l

     ⑥  译码 ,根据输入的字符串,从根节点开始想下边遍历,如果是1就向右子树,0就是左子树,直到找到一个叶子节点就退出。继续从根节点开始。

代码如下:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#define max 200
using namespace std;
struct jcode//求得概率之后的结构体
{
    char c;
    int x;//概率
    int b;//下标
    friend bool operator<(jcode a, jcode b ){//优先队列排序
        return b.xq,huffman &t,int cnum,jjnum str)//构造哈夫曼树
{
    int i,a1,a2;
    for(i=0;i<2*cnum-1;i++)//初始化结点
    {
       t[i].lchild = t[i].parent = t[i].rchild = t[i].x  = 0;
       t[i].data= '1';

    }
    for(i=0;i=0;j--)
            cout<q2;
    for(i = 0; i < num; i++)//加入优先队列
        q2.push(str[i]);
    create(q2,t,num,str);
}
void yima(string ss,int i,huffman &t,int num,int cnum)//译码
{
    while(num>=cnum)//从根节点开始
    {
      if(ss[i]=='1')
      {
          num = t[num].rchild;
          i++;
      }
      else
     {
          num = t[num].lchild;
          i++;
      }
    }
    if(i<=ss.length())//得到一个叶子节点,即译出一个字符
    {
      cout<=0;j--)
               cout<


你可能感兴趣的:(c++学习)