• 大小: 5KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-05-13
  • 语言: C/C++
  • 标签: c++  n元  信息论  

资源简介

n元哈夫曼编码,如果大家作为信息论课设的话,记得拿到代码读懂后再修改。

资源截图

代码片段和文件信息

#include
#include
#include
#include
#define maxnum 10  //限制最多进行10元编码 
#define leaf 257   //最多需要编码的字符
#define node 2*leaf-1  //Huffman树的结点数
#define max 32768
using namespace std;
int num;//字符串总长度
int num1;//扩展后总数

//编码结点
 typedef struct{
    int len;
    char ch;
    char bits[10];
}HC;
typedef HC HuffmanCode[leaf+1];
//huffman树的结点
typedef struct{
    int weight;
    int parent;
    int child[maxnum];
}HTNode;
typedef HTNode HuffmanTree[node+1];

//统计输入的字符串的字符以及每个字符的个数
void jsq(string sint cnt[]char str[])
{
    int i=0j=0k=0;
//初始化
for(i=0;i<257;i++){
        str[i]=‘\0‘;
}
    for(i=0;i<257;i++){
        cnt[i]=0;
    }
    int temp[257];
    for(i=0;i<257;i++)
        temp[i]=0;
    for(i=0;s[i]!=‘\0‘;i++)
        temp[ s[i] ]++;
    for(i=0j=0;i<=256;i++)
        if(temp[i]!=0){
            j++;
            str[j]=i;
            cnt[j]=temp[i];
        }
    num=j;
    cout<<“共有“<}
//从中挑选n个最小的出来n表示挑选多少个
void select(HuffmanTree HTint lenint n){
    int ijmintemp;
    for(j=0;j        min=max;
        for(i=1;i<=len;i++){
            if(HT[i].parent==0 && HT[i].weight                min=HT[i].weight;
                temp=i;
            }
        }
        HT[temp].parent=len+1;
        HT[len+1].child[j]=temp;    
HT[len+1].weight=HT[len+1].weight+HT[temp].weight;
    }                                                                                                                
}
//创建霍夫曼树
void chuffmantree(HuffmanCode HCHuffmanTree HTchar str[]int cnt[]int n ){
    int ij;
    for(i=0;i<2*num-1;i++){
        HT[i].weight=0;
        HT[i].parent=0;
        for(j=0;j            HT[i].child[j]=0;
}
    }
for(i=1;i<=num;i++){
        HC[i].ch=str[i];
    }
    for(i=1;i<=num;i++){
        HT[i].weight=cnt[i];//每个结点权值等于相应的符号个数值
    }
    //扩充
    int k=0;
    if(num!=n)
k=(num-n)/(n-1)+1;
    num1=(n-1)*k+n;
for(i=num;i HT[i].weight=0;
}
    for(i=num1+1;i<=num1+k+1;i++){
        //从中挑选n个最小的出来
        select(HTi-1n);
    }
}
/

评论

共有 条评论