最优前缀编码

最优前缀编码

先来理解一下什么是最优前缀编码:
		最优前缀编码,也称 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,最后打印出来即可。
下面为我的一个例子结果输出:
在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值