赫夫曼编码主要用于数据压缩(无损压缩)
什么是赫夫曼树?
树结点间的连线相关的数叫做权
结点的路径长度:从根结点到该结点的路径上的连接数
树的路径长度:树中每个叶子结点的路径长度之和
结点带权路径长度:结点的路径长度与结点的权值的乘积
树的带权路径长度:WPL(Weight Path Length)是树中所有叶子结点的带权路径长度之和
WPL的值越小,说明构造出来的二叉树的性能越优
最优赫夫曼树的构造方法:
1、拥有一个森林
2、在森林中选出两棵根结点的权值最小的二叉树
3、合并两棵选出的二叉树,增加一个新结点作为二叉树的根,权值为左右孩子的权值之和(权值小的在左、大的在右)
4、在森林中再选择一个权值较小的结点,与刚刚产生的新结点在同一层,如果权值小于产生的新结点的权值则在新结点左侧;否则,在新结点右侧。
赫夫曼编码
赫夫曼编码可以有效压缩数据,一般可以节省20% —— 90%的空间(具体压缩率与数据特性有关)
定长编码:ASCII编码(用8位表示一个字符)
变长编码:单个编码的长度不一致,可以根据整体出现频率来调节
前缀吗:没有任何码字是其它码字的前缀
创建赫夫曼编码需要的工作:
1、建立一个有优先级的队列
2、建立一棵赫夫曼树
3、建立一个赫夫曼表
赫夫曼编码规定左子树全用0表示,右子树全用1表示
赫夫曼编码C语言实现
#include<stdio.h>
#include<stlib.h>
#include“huffmsn.h”
intmain(void)
{
htTree *codeTree = buildTree(“ I loveFishC.com!”);
hltable *codeTable =buildTable(codeTree);
encode(codeTable, “I love FishC.com!”);
decode(codeTree,“ 0011111000111”);
return 0;
}