哈弗曼树的创建编码及译码

哈弗曼树创建并实现编码译码

采用C语言实现从文件读取数据,构造创建哈弗曼树,实现编码译码过程。

1.哈弗曼树的基本概念
哈弗曼树,又称为最优二叉树,是带权路径最短的树,可用来构造最优编码,用于信息传输,数据压缩等方面,是一种广泛的二叉应用。
需要了解的基本概念:
- 路径:从树的一个节点到另一个节点之间的分支序列构成两个节点的路径
- 路径程度:路径上分支的条数
- 树的路径长度:从跟节点到每个节点路径的长度之和
- 节点的权: 给数种节点赋予一个数值
- 带权路径长度:节点到树根间的路径长度与节点的权值的乘积
- 树的带权路径长度:树中所有叶子节点的带权路径长度之和,成为树的带权路径长度,记为WPL。
- 最优二叉树:在叶子节点个数n以及各叶子的权值确定的条件下,树的带权路径长度WPL最小的二叉树。
例如:如下三棵树的权值分别为{9,6,3,1}的四个叶子构成,其带权路径长度为:
带权路径长度不同的二叉树
可以验证:c树是有四个叶子且权值分别为{9,6,3,1}的一棵最优二叉树
2 . 哈弗曼编码原理:选择前缀编码,即:同一字符集中任何一个字符的编码都不是另一个字符编码的前缀。例如:对于字符集{A,B,C,D},编码集对应为{1,01,000,001}。另一方面,为了有效的压缩信息,则出现频率高的字符编码应该短一些,而出现字符频率小字符编码则长一些,观察哈弗曼树可以发现,权值大的叶子距根近,权值小的反之。因此,可以利用哈弗曼树的根到叶子节点的路径设计编码。每一个字符对应一个叶子,每一个权值对应出现频率。 哈弗曼编码是最优二进制前缀编码。
3. 哈弗曼译码原理:译码分解、识别、还原数据的过程。从哈弗曼树的根出发,根据每位编码的0或1确定进入左子树还是右子树,直到叶子节点。
4.C语言编程实现过程
- 哈弗曼树建立的数据结构:
weight:节点的权值
LChild:左孩子
RChild:右孩子
Parent:双亲
data:存储字符数据

typedef struct CodeNode
{
 char ch;
 char bits[9];//存放编码位置
 int len;//编码长度
}HuffmanCode[MAX];

变量声明:

int wt[MAX];//存放每个字符对应的权值
int Wt[MAX];
char s[MAX];//存放文件中的字符
char str[MAX];//存放文件中的字符种类
char chara[MAX];
int m;//字符种类数
int sum;//字符总个数
int cn=0;//字符频率
char filename[20];

提取文件中的字符,用哈希表统计字符频率,哈希表数组下标数值对应字符的ACSII码大小,哈希数组中对应存储权值

void  Get(huffmanTree Ht,chars[])
{   FILE *fp;

 char ch;
 int i=1;

 printf("请输入你要打开文件的名字:");
 scanf("%s",filename);
 fp=fopen(filename,"r");
 if(fp==NULL)
 { printf("\t\tCan not open thefile");
 system("pause");
 }
 
  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值