霍夫曼编码(Huffman Coding)是可变长编码(VLC)的一种,于1952年由Huffman提出。Huffman编码属于无损压缩编码,且所编得的码为即时码,虽然编码方式不唯一,但是平均码长是确定且最短的。该编码方式广泛用于JPEG、MPEG等各种标准中。
Huffman码的原理非常简单,就是给概率大的码字分配短码,而给那些较少出现的码字分配长码。
这里以一张图做简要说明
就是一个对码字先依概率进行排序,然后构造一颗Huffman二叉树的过程。
然后对构造Huffman二叉树的C语言代码进行简要说明。
1.建立一些结构体
- //Huffman树结点类型
- typedef struct HFNODE
- {
- int w;
- struct HFNODE *lchild;
- struct HFNODE *rchild;
- }HfNode;
//typedef struct HFNODE HfNode;
同理
- //链表结点类型
- typedef struct LNODE
- {
- struct LNODE *pnext;
- HfNode *proot;
- }LNode;
2.相应的函数
紧接着有个构造二叉树的函数
- HfNode *Huffman(int n, int *w);
l = (LNode*)malloc(sizeof(LNode)); //创建头结点
- for ( i=0; i<n; i++ ){
- hnew = (HfNode*)malloc(sizeof(HfNode));
- hnew->w = w[i];
- hnew->lchild = NULL;
- hnew->rchild = NULL;
- OrderWeight(&l, hnew);
- }
其中OrderWeight(&l, hnew)的作用就是挂上所创建的节点。
最后该函数的返回值
h = (HfNode*)malloc(sizeof(HfNode)); return h;
返回的是个head节点的指针,并该返回值作为 void ReOrderTraverse(HfNode *h, int n) 的参数。
- void ReOrderTraverse(HfNode *ht, int n){
- if ( ht != NULL ){
- if ( ht->lchild == NULL && ht->rchild == NULL ){
- //TODO:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
- }
- ReOrderTraverse(ht->lchild, n + 1);
- ReOrderTraverse(ht->rchild, n + 1);
- }
- }
至此构造一颗Huffman二叉树的代码的原理就基本明了了。
-------------------学习笔记