算法导论程序41--赫夫曼编码

贪心算法的原理:


赫夫曼编码可以很有效地压缩数据:通常可以节省20%~90%的空间。


根据每个字符的出现频率,赫夫曼贪心算法构造出字符的最优二进制表示。



变长编码可以达到定长编码好得多的压缩率,其思想是赋予高频字符短码字,赋予低频字符长码字。


前缀码:即没有任何码字是其他码字的前缀。前缀码可以保证达到最优数据压缩率(证明略)


前缀码的作用是简化解码的过程。由于没有码字是其他码字的前缀,编码文件的开始码字是无歧义的,我们可以简单地识别出开始码字,将其转换回原字符,然后对编码文件剩余部分重复这种解码过程。


编码树:解码过程需要前缀码的一种方便的表示形式,以便我们可以容易地截取开始码字。一种二叉树表示可以满足这种需求,其叶结点为给定的字符。字符的二进制码字从根结点到该字符叶结点的简单路径表示,其中0意味着“转向左孩子”,1意味着转向右孩子。


文件的最优编码方案总是对应一棵满(full)二叉树,即每个非叶结点都有两个孩子结点。

现在我们只关注满二叉树。若C为字母表且所有字符的出现频率均为正数,则最优前缀码对应的树恰有|C|个叶结点,每个叶结点对应字母表中的一个字符,且恰有|C|-1个叶结点。



构造赫夫曼编码:

赫夫曼设计了一个贪心算法来构造最优前缀码,被称为赫夫曼编码。

我们假定C是一个n个字符的集合,其中每个字符c属于C都是一个对象,其属性c.freq给出了字符的出现频率。算法自底向上构造出对应最优编码的二叉树T,它从|C|个叶结点开始,执行|C|-1“合并”操作创建出最终的二叉树。算法使用一个以属性freq为关键字最小优先队列Q,以识别最低频率的对象将其合并。当合并两个对象时,得到的新对象频率设置为原来的两个对象的频率之和。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值