最优前缀编码
先来理解一下什么是最优前缀编码:
最优前缀编码,也称 Huffman 编码。这种编码组合的特点是对于较频繁使用的元素给与
较短的唯一编码,以提高通讯的效率。
理解了最优前缀编码后一起来看一下问题:
给定字符集C={x1,x2,…,xn}和每个字符的频率f(xi),求关于C的一个最优前缀码。
解析:
解题前最重要的就是确定用什么算法去实现,这里很明显使用哈夫曼算法来解决。
学过数据结构的应该对哈夫曼树比较熟悉了。这里举个例子:
选取几个数分别为:6、2、7、9、5
对他们进行排序后:2、5、6、7、9
每次都选去其中最小的两个元素作为树的左右节点(大在左)
不断重复知道最后只剩下一颗树,这课树就是我们构建的哈夫曼树。
哈夫曼树构建完成后就是求我们的哈夫曼编码了。
很简单,左子树为1,右子树为0。按图中的哈夫曼树我们很快就能得到:
3:100
5:101
6:00
7:01
9:11
设计:
首先就是定义树结构以及编码存储的结构
typedef struct
{
int weight;
char ch;
int parent;
int leftchild;
int rightchild;
}Huffman;
typedef struct
{
int code[100]; //哈夫曼编码的存储
int start; //开始位置
}Hcode;
定义好结构后就开始构建哈夫曼树了。
构建哈夫曼树最重要的就是从小的开始,而且两个最小的元素中较大的还要放在左子树。
for (int i=0;i<n-1;i++)
{
a=b=-1;
c=d=10000;
for (int j=0;j<n+i;j++)
{
if (huffman[j].parent==-1 && huffman[j].weight<c)
{
d=c;
b=a;
a=j;
c=huffman[j].weight;
}
else if (huffman[j].parent==-1 && huffman[j].weight<d)
{
b=j;
d=huffman[j].weight;
}
}
huffman[n+i].leftchild=a;
huffman[n+i].rightchild=b;
huffman[n+i].weight=c+d;
huffman[a].parent=n+i;
huffman[b].parent=n+i;
}
构建好哈夫曼树通过对字符权重的搜索一步步将编码存储进入code,最后打印出来即可。
下面为我的一个例子结果输出: