• 大小: 3KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-09
  • 语言: C/C++
  • 标签:

资源简介

对26个英文字母(已知它们的概率分布)进行了哈夫曼编码,并计算了编码效率。有助于大家理解哈夫曼编码以及信息论的相关知识哦。

资源截图

代码片段和文件信息

//得到26个英文字母的哈夫曼编码,并计算编码效率和压缩比
#include
#include
#include
#define K 26 //26个字母
#pragma comment(linker “/subsystem:console“)

struct code //二元码字
{
int cod; //二元码字,存放在int cod的各位中
char len_cod; //码字长度
float prob; //在符号空间中出现的概率
};
struct tree //用于得到哈夫曼码构造的哈夫曼树
{
float prb[2*K-1]; //2*K-1个结点
char left[K-1]; //左孩子
char right[K-1]; //右孩子
};

float pcb[K]={8.191.473.833.9112.252.261.714.57
  7.100.140.413.773.347.067.262.89
  0.096.856.369.412.581.091.590.21
  1.580.08}; //26个英文字母概率矢量(百分比)
code hufcode[K]; //哈夫曼编码
tree huftree; //哈夫曼树

void add_sig_0(char node); //递归函数
void add_sig_1(char node); //往某结点下所有叶子结点对应的码字添加0或1

void main()
{
int i;
char min1=0min2=0; //俩最小值的index
char visit[2*K-1]; //各结点是否被访问过
memset(visit02*K-2);
//初始化
for(i=0;i {
hufcode[i].prob=huftree.prb[i]=pcb[i]/100; //概率,赋给码字,也赋给树的叶子结点
hufcode[i].len_cod=0; //码字从、长度
hufcode[i].cod=0; //码字
}
//找最小并合并,K-1次
for(int cnt=0;cnt {
//先从头找到第一个没被访问过的
for(i=0;i if(visit[i]==0) //没被访问过
{
min1=i;
break;
}
//找第二个没被访问过的
for(i=i+1;i if(visit[i]==0)
{
if(huftree.prb[i]

评论

共有 条评论