贪心算法应用-哈夫曼编码

  哈夫曼编码应用于数据文件和图像压缩的编码方式。其压缩率通常在20%~90%之间、在进行远距离通信时,通常需要把将要传送的文字转换为由二进制字符组成的字符串,并使要传送的电文总长度尽可能的短。显然只要将点文章出现次数多的字符采用尽可能短的编码,就可以减少要传送的电文总长度。

哈夫曼编码的核心思想:

(1)每一个字符用一个0,1串作为其代码,并要求任意一个字符的代码都不是其他字符代码的前缀。

(2)用字符在文件中出现的频率来建立一个用0,1串表示各字符的最优表示方式,即使出现频率高的字符获得较短编码,出现频率较低的字符获得较长编码。

(3)将字符在文件中出现的频度值作为一颗二叉树的叶子节点的权值,并通过构造一颗哈夫曼树得到最优前缀码。

哈夫曼树的构建

哈夫曼树又称为最优二叉树。它是由n个带权叶子节点构成的所有二叉树中,带权路径长度最小的二叉树(即树中所有叶子节点的带权路径长度之和)。显然,寻找哈夫曼编码的过程就是构造哈夫曼树的过程。

构造哈夫曼树的步骤

1)用给定的n个权值{w1,w2……w3}对应的n个节点构成n颗二叉树的森林 F={T1,T2……Tn},其中每一颗二叉树Ti都只有一个权值为Wi的根节点,其左右子树为空。

2)在森林F中选择两颗根结点权值最小的二叉树,作为一颗新二叉树的左右子树,标记新二叉树的根结点权值为其左右子树的根结点权值之和。

3)从F中删除被选出的那两颗二叉树,同时把新构成的二叉树加入到森林F中。

4)重复第二、三操作,直到森林中只含有一颗二叉树为止,此时得到的这颗二叉树就是哈夫曼树。

哈夫曼树中没有度为1的结点,且具有n个字符的哈夫曼树的结点总数为2n-1个,因此可以使用顺序存储结构来实现哈夫曼算法。将结点信息存储在一个2n-1个的一维数组中。当构造完哈夫曼树后,求每一个字符的编码过程就是走一条从叶子结点到根结点的路径。译码的过程需要走一条从根结点到叶子结点的路径。因此,哈夫曼树的结点结构中一个包含其孩子结点和父节点的信息。

时间: 2024-11-05 21:41:24

贪心算法应用-哈夫曼编码的相关文章

算法学习-哈夫曼编码(c++实现)

哈夫曼编码 哈夫曼编码虽然简单,但是是一个非常重要的编码方式,它解决了数据存储的一个非常重要的问题:压缩!它的编码方式是最优的,无损的,尤其在图像中使用的非常多.下面讲下它的原理. 编码方式 哈夫曼编码的构造是依据权值的大小来实现的.首先根据权值构造哈夫曼树,然后对哈夫曼树进行逆向遍历,从而找到每个节点的编码方式. 例如: abbcccdddde这个是一个字符串,一共有5个字符.每个字符的权值就是出现的频率,那么a就是1,b权值为2,c的权值为3,d的权值为4,e的权值为1.在普通的编码方式中,

一步两步学算法之哈夫曼编码(最优二叉树)

比较难理解的 都打了备注了 1 #include "stdio.h" 2 #include "stdlib.h" 3 #include "string.h" 4 char alphabet[]={'A','B','C','D'}; 5 typedef struct 6 { 7 int weight; //权值 8 int parent; //父节点序号 9 int left ; 10 int right; 11 }HuffmanTree; 12

贪心算法-霍夫曼编码

霍夫曼编码是一种无损数据压缩算法.在计算机数据处理中,霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的,出现机率高的字母使用较短的编码,反之出现机率低的则使用较长的编码,这便使编码之后的字符串的平均长度.期望值降低,从而达到无损压缩数据的目的.例如,在英文中,e的出现机率最高,而z的出现概率则最低.当利用霍夫曼编码对一篇英文进行压缩时,e极有可能用一个比特来表示,而z则可能花去25个比特(不是26).用普通的表示方法时,每个

哈夫曼编码--贪心策略

哈夫曼编码还是在暑假时候看的,那时候并没有看懂因为比较菜(虽然现在也是很菜的),在<趣学算法>一书中这个问题讲解十分到位,我这篇博客真的是难以望其项背,只能对其进行一点借鉴和摘抄吧 哈夫曼编码是一棵树,权值越大的节点越靠近树根,越小的节点就越远离树根,从他的定义来看,首先想到的应该是贪心策略吧,没错就是贪心算法 虽然说是贪心算法,但是还要知道它 的实现方式啊,他的贪心策略是:每次从树的集合中取出没有双亲且权值最小的两棵树作为左右子树,并合并他们 步骤 : 1 :确定合适的数据结构(要知道他的左

信源编码算法(费诺编码&amp;&amp;哈夫曼编码)

信源编码算法 费诺编码 Fano coding 哈夫曼编码 Huffman coding 费诺编码 编码步骤 将信源符号按照其概率大小,从大到小排列: 将这一组信源符号分成概率之和尽可能接近或者相等的一组(即两组分别的概率和之间的差尽可能小!): 将上面一组符号编码成0,下面一组编码成1,反之亦可: 将已经分好的组重复步骤2,3,直到不能再进行分组为止: 从左到右一次写出码字. 费诺编码演示 已知: 编码过程为: 哈夫曼编码 Huffman coding 编码步骤 将信源符号按照概率大小从大到小

【算法总结】哈夫曼树和哈夫曼编码

一.哈夫曼树 1. 哈夫曼树也称最优二叉树. 叶子节点的权值是对叶子节点赋予的一个有意义的数值量. 设二叉树具有 n 个带权值的叶子结点,从根节点到各个叶子结点的路径长度与相应叶子结点权值的乘积之和叫做二叉树的带权路径长度. 给定一组具有确定权值的叶子结点,可以构造处不同的二叉树,将其中带权路径长度最小的二叉树称为哈夫曼树. 2. 基本思想: 初始化:由给定的 n 个权值 $\left\{ \omega_{1},\omega_{2},\cdots ,\omega_{n}\right\}$构造 n

HDU 1053 Entropy(哈夫曼编码 贪心+优先队列)

传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1053 Entropy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7233    Accepted Submission(s): 3047 Problem Description An entropy encoder is a data

【数据结构与算法】二叉树——哈夫曼编码

最近有很多的小朋友问我什么是哈夫曼编码,哈夫曼编码是一种可变字长的编码,那什么是可变字长呢?就是一句话里的每一个字符(ASCII码)它的位数(长度)是不一样的.就像我们一句话(AAAACCCCCDDDDBBE)有A,B,C,D,E五种字符,在这里我们可以用01表示A字符,用001表示B字符,用11表示C字符,用10表示D字符,用000表示E字符.如下图: 既然知道了哈夫曼编码是什么了,那又有好奇的小朋友又会问了:那么哈夫曼编码是按照什么原理生成的呢? 在这里我就要告诉大家,哈夫曼编码是根据哈夫曼

哈夫曼编码

   1.问题描述 哈夫曼编码是广泛地用于数据文件压缩的十分有效的编码方法.其压缩率通常在20%-90%之间.哈夫曼编码算法用字符在文件中出现的频率表来建立一个用0,1串表示各字符的最优表示方式.一个包含100,000个字符的文件,各字符出现频率不同,如下表所示. 有多种方式表示文件中的信息,若用0,1码表示字符的方法,即每个字符用唯一的一个0,1串表示.若采用定长编码表示,则需要3位表示一个字符,整个文件编码需要300,000位:若采用变长编码表示,给频率高的字符较短的编码:频率低的字符较长的