算法导论程序41--赫夫曼编码
来源:互联网 发布:mac landesk 卸载 编辑:程序博客网 时间:2024/05/29 17:31
贪心算法的原理:
赫夫曼编码可以很有效地压缩数据:通常可以节省20%~90%的空间。
根据每个字符的出现频率,赫夫曼贪心算法构造出字符的最优二进制表示。
变长编码可以达到定长编码好得多的压缩率,其思想是赋予高频字符短码字,赋予低频字符长码字。
前缀码:即没有任何码字是其他码字的前缀。前缀码可以保证达到最优数据压缩率(证明略)
前缀码的作用是简化解码的过程。由于没有码字是其他码字的前缀,编码文件的开始码字是无歧义的,我们可以简单地识别出开始码字,将其转换回原字符,然后对编码文件剩余部分重复这种解码过程。
编码树:解码过程需要前缀码的一种方便的表示形式,以便我们可以容易地截取开始码字。一种二叉树表示可以满足这种需求,其叶结点为给定的字符。字符的二进制码字从根结点到该字符叶结点的简单路径表示,其中0意味着“转向左孩子”,1意味着转向右孩子。
文件的最优编码方案总是对应一棵满(full)二叉树,即每个非叶结点都有两个孩子结点。
现在我们只关注满二叉树。若C为字母表且所有字符的出现频率均为正数,则最优前缀码对应的树恰有|C|个叶结点,每个叶结点对应字母表中的一个字符,且恰有|C|-1个叶结点。
构造赫夫曼编码:
赫夫曼设计了一个贪心算法来构造最优前缀码,被称为赫夫曼编码。
我们假定C是一个n个字符的集合,其中每个字符c属于C都是一个对象,其属性c.freq给出了字符的出现频率。算法自底向上构造出对应最优编码的二叉树T,它从|C|个叶结点开始,执行|C|-1“合并”操作创建出最终的二叉树。算法使用一个以属性freq为关键字最小优先队列Q,以识别最低频率的对象将其合并。当合并两个对象时,得到的新对象频率设置为原来的两个对象的频率之和。
- 算法导论程序41--赫夫曼编码
- 算法导论贪心算法-构造赫夫曼编码
- 【算法导论】贪心算法之赫夫曼编码
- 算法导论 哈夫曼编码
- 算法导论哈夫曼编码
- [算法导论读书笔记]huffman编码
- 算法导论之--------------Huffman编码
- 算法导论之哈夫曼编码
- 算法导论第16章 构造赫夫曼编码
- 基于visual Studio2013解决算法导论之047赫夫曼编码
- 《算法导论》笔记 第16章 16.3 赫夫曼编码
- 算法导论 ch16 贪心算法 霍夫曼编码
- 算法导论之贪心算法:哈夫曼编码
- 算法导论第十五章--霍夫曼编码
- 算法导论之贪心算法(Huffman编码和拟阵)
- 【算法导论】程序出错的解释说明
- 算法导论程序8--堆(Python)
- 算法导论程序16--基数排序(Python)
- navicat工具来将SQL Server数据迁移到MySQL
- 裸奔的驴算法刷题日记5-31
- Android开发之http网络请求返回码问题集合。
- java通过JDBC驱动连接操作hive实例
- IDisposable 接口 使用准则
- 算法导论程序41--赫夫曼编码
- Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
- 调度组dispatch_group_t
- Android 5.1高通方案增加GPIO按键
- php判断 !==false
- SSL peer shut down incorrectly
- Head First JavaScript 存储数据
- 数据增强:DataAugmentation
- Java中管道报错:Write end dead