算术编码与哈夫曼编码
- 格式:doc
- 大小:546.50 KB
- 文档页数:27
一、霍夫曼编码1.1编解码原理在通信系统中常用不等长的编码,对常用的字符用较少的码位编码,不常用的字符用较多的码位编码,从而减少文本的存储长度。
霍夫曼编码就是这样一类码制。
根据霍夫曼的定义,一棵二叉树要使其带权路径长度最小,必须使权值越大的叶子结点越靠近根结点,而权值越小的叶子结点越远离根结点.依据这个特点便提出了霍夫曼算法,其基本思想是:(1)初始化:由给定的n个权值{w1,w2,…,wn}构造n棵只有一个根结点的二叉树,从而得到一个二叉树集合F={ T1,T2,…,Tn};(2)选取与合并:在F中选取根结点的权值最小的两棵二叉树分别作为左、右子树构造一颗新的二叉树,这棵新二叉树的根结点的权值为其左、右子树根结点的权值之和;(3)删除与加入:在F中删除作为左、右子树的两棵二叉树,并将新建立的二叉树加入到F中;(4) 重复(2)、(3)两步,当集合F中只剩下一棵二叉树时,这棵二叉树便是霍夫曼树。
通过霍夫曼树,就可以得到霍夫曼的编码和译码过程。
霍夫曼树可用于构造最短的不等长编码方案,具体做法如下:设需要编码的字符集合为{d1,d2,…,d¬n},它们在字符串中出现的频率为{w1,w2,…,wn},以d1,d2,…,d¬n作为叶子结点的字符集,w1,w2,…,wn¬作为叶子结点的权值集,构造一颗霍夫曼编码树,规定霍夫曼编码树的左分支代表0,右分支代表1,则从根结点到每个叶子结点所经过的路径组成的0和1的序列便为该叶子结点对应字符的编码,称为霍夫曼编码。
霍夫曼树构造的编码是一种能使字符串的编码总长度最短的不等长编码.由于霍夫曼编码树的每个字符结点都是叶子结点,它们不可呢在根结点到其他字符结点的路径上,所以一个字符的霍夫曼编码不可能是另一个字符的霍夫曼编码的前缀,从而保证了解码的唯一性。
利用霍夫曼树求霍夫曼编码的过程属于霍夫曼译码的过程。
当已知霍夫曼树的情况下,理论上可以求出任何二进制码制所代表的原码。
哈夫曼编码设计原理哈夫曼编码(HuffmanCoding)是一种十分重要的信息压缩编码技术,它能够给予信息流最有效的编码,一般情况下它能够实现信息量的压缩,从而节省载体存储和信息传输的带宽和时间。
因此,哈夫曼编码是许多数据传输、压缩和存储应用中不可缺少的一部分。
哈夫曼编码基于信息熵的概念,是由美国著名科学家卡尔哈夫曼在1952年提出来的,他提出了一种构建最优编码树的算法,这种编码树也被称为哈夫曼树。
哈夫曼编码原理基于概率编码理论,该理论规定是:为了实现最优编码,必须给出根据待编码字符及其出现概率给出的编码的编码顺序,以此构建哈夫曼树,来实现最优编码。
哈夫曼树的构建方法如下: 1)计算每个字符的概率,并按从大到小的顺序排列。
2)选择概率最小的两个字符,合并成一个新的结点,结点概率为两者概率之和,新形成的结点也排在概率队列的最后。
3)重复上述过程,直到所有的字符都被归入一个结点中,得到一棵哈夫曼树。
值得注意的是,哈夫曼编码的最优性能实际上是由哈夫曼树的构建方法来实现的,而哈夫曼树的构建是基于概率编码理论的基础上进行的,因此,只有给定有限规模的字符集,而且这些字符出现的概率必须符合概率编码理论,哈夫曼编码才能正常工作,从而达到压缩效果。
此外,哈夫曼编码还有许多其他优势,比如它可以实现稳定性和循环利用性,并且可以根据不同的信息实时分析和更新,从而达到准确无误的编码效果。
此外,由于它的编码方案是可以被逆向变换的,因此,解码的效果也能够超过预想的期望,从而使得解码效率得到显著提高。
总之,哈夫曼编码的实际应用使得它在信息压缩、数据传输以及数据存储等领域发挥着至关重要的作用。
它能够有效减少信息量,帮助节省带宽,使传输成本大大降低,从而提高数据传输和存储的效率,并能够释放更多的内存空间,从而提高信息传输的速度,大大改善数据传输的效率。
1.哈夫曼编码的方法编码过程如下:(1) 将信源符号按概率递减顺序排列;(2) 把两个最小的概率加起来, 作为新符号的概率;(3) 重复步骤(1) 、(2), 直到概率和达到1 为止;(4) 在每次合并消息时,将被合并的消息赋以1和0或0和1;(5) 寻找从每个信源符号到概率为1处的路径,记录下路径上的1和0;(6) 对每个符号写出"1"、"0"序列(从码数的根到终节点)。
2.哈夫曼编码的特点①哈夫曼方法构造出来的码不是唯一的。
原因·在给两个分支赋值时, 可以是左支( 或上支) 为0, 也可以是右支( 或下支) 为0, 造成编码的不唯一。
·当两个消息的概率相等时, 谁前谁后也是随机的, 构造出来的码字就不是唯一的。
②哈夫曼编码码字字长参差不齐, 因此硬件实现起来不大方便。
③哈夫曼编码对不同的信源的编码效率是不同的。
·当信源概率是2 的负幂时, 哈夫曼码的编码效率达到100%;·当信源概率相等时, 其编码效率最低。
·只有在概率分布很不均匀时, 哈夫曼编码才会收到显著的效果, 而在信源分布均匀的情况下, 一般不使用哈夫曼编码。
④对信源进行哈夫曼编码后, 形成了一个哈夫曼编码表。
解码时, 必须参照这一哈夫编码表才能正确译码。
·在信源的存储与传输过程中必须首先存储或传输这一哈夫曼编码表在实际计算压缩效果时, 必须考虑哈夫曼编码表占有的比特数。
在某些应用场合, 信源概率服从于某一分布或存在一定规律使用缺省的哈夫曼编码表有解:为了进行哈夫曼编码, 先把这组数据由大到小排列, 再按上方法处理(1)将信源符号按概率递减顺序排列。
(2)首先将概率最小的两个符号的概率相加,合成一个新的数值。
(3)把合成的数值看成是一个新的组合符号概率,重复上述操作,直到剩下最后两个符号。
5.4.2 Shannon-Famo编码Shannon-Famo(S-F) 编码方法与Huffman 的编码方法略有区别, 但有时也能编出最佳码。
哈夫曼编码名词解释哈夫曼编码是一种用于数据压缩的编码方式。
由于它可以减小文件的体积,并且在传输文件时速度更快,因此在实际应用中非常重要。
哈夫曼编码一些重要的名词解释如下:一、频率频率是指特定字符在文本中出现的次数。
在哈夫曼编码中,频率用于计算每个字符的权重,权重越高的字符,使用的编码位数越少。
二、前缀码前缀码是指没有任何码字是其它码字的前缀的编码方式。
哈夫曼编码就是一种前缀码,没有任何哈夫曼编码的码字是其它码字的前缀,这是保证哈夫曼编码解码准确性的关键所在。
三、码树码树是一种包含权重、编码、二进制位数的树形数据结构。
在哈夫曼编码中,码树由文本中出现的字符的频率构成,每个字符用一个叶节点代表,叶节点和中间节点通过一个编码连接起来。
四、权重权重是指字符在文本中出现的频率,在哈夫曼编码中,它用于计算每个字符在编码中的位数,权重越高的字符使用的编码位数越少。
五、码字码字是指表示一个字符的二进制编码,长度不同的码字代表着不同权重的字符。
六、编码编码是将字符或数据转化为码字的过程,在哈夫曼编码中,通过经过计算得出的权重来生成码字。
七、解码解码是将码字转化为字符或数据的过程,在哈夫曼编码中,根据每个字符的码字和频率生成码树,在树中查找出对应的字符,从而将码字还原为原始的字符。
八、二进制二进制是计算机中表示数字的一种方式,它只包含0和1两种数值,在哈夫曼编码中,使用二进制来表示每个字符的码字。
总之,哈夫曼编码在很多领域都有着重要的应用,了解这些关键名词的含义将更好的理解和掌握它的原理,也会帮助你更好的使用它。
哈夫曼编码一、概述哈夫曼编码(Huffman Coding)是一种编码方式,哈夫曼编码是可变字长编码(VL C)的一种。
Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫作Huffman编码。
以哈夫曼树─即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。
在计算机信息处理中,“哈夫曼编码”是一种一致性编码法(又称"熵编码法"),用于数据的无损耗压缩。
这一术语是指使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。
这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。
这种方法是由David.A.Huffman发展起来的。
例如,在英文中,e的出现概率很高,而z的出现概率则最低。
当利用哈夫曼编码对一篇英文进行压缩时,e极有可能用一个位(bit)来表示,而z则可能花去25个位(不是26)。
用普通的表示方法时,每个英文字母均占用一个字节(byte),即8个位。
二者相比,e使用了一般编码的1/8的长度,z则使用了3倍多。
倘若我们能实现对于英文中各个字母出现概率的较准确的估算,就可以大幅度提高无损压缩的比例。
哈夫曼压缩是个无损的压缩算法,一般用来压缩文本和程序文件。
哈夫曼压缩属于可变代码长度算法一族。
意思是个体符号(例如,文本文件中的字符)用一个特定长度的位序列替代。
因此,在文件中出现频率高的符号,使用短的位序列,而那些很少出现的符号,则用较长的位序列。
二、C语言程序实现文件的huffman编码#include <stdio.h>#define MAX 1000#define MAXSYMBS 30#define MAXNODE 59typedef struct{int weight;int flag;int parent;int lchild;int rchild;}huffnode;typedef struct{int bits[MAXSYMBS];int start;}huffcode;void main(){huffnode huff_node[MAXNODE];huffcode huff_code[MAXSYMBS],cd;int i,j,m1,m2,x1,x2,n,c,p; /*char symbs[MAXSYMBS],symb;*//*数组buff_node初始化*/printf("please input the leaf num of tree:\n");scanf("%d",&n);for(i=0;i<2*n-1;i++){huff_node[i].weight=0;huff_node[i].parent=0;huff_node[i].flag=0;huff_node[i].lchild=-1;huff_node[i].rchild=-1;}printf("please input the weight of every leaf\n");for(i=0;i<n-1;i++)scanf("%d",&huff_node[i].weight);/*构造哈弗曼树*/for(i=0;i<n-1;i++){m1=m2=MAX;x1=x2=0;for(j=0;j<n+i;j++){if(huff_node[j].weight <m1&&huff_node[j].flag ==0){m2=m1;x2=x1;m1=huff_node[j].weight ;x1=j;}else if (huff_node[j].weight <m2&&huff_node[j].flag ==0) {m2=huff_node[j].weight;x2=j;}}huff_node[x1].parent=n+i;huff_node[x2].parent=n+i;huff_node[x1].flag =1;huff_node[x2].flag =1;huff_node[n+i].weight =huff_node[x1].weight +huff_node[x2].weight ; huff_node[n+i].lchild =x1;huff_node[n+i].rchild =x2;}/*求字符的哈弗曼编码*/for(i=0;i<n;i++){cd.start =n;c=i;p=huff_node[c].parent ;while(p!=0){if(huff_node[p].lchild ==c)cd.bits [cd.start ]=0;elsecd.bits [cd.start ]=1;cd.start=cd.start -1;c=p;p=huff_node[p].parent ;}cd.start ++;for(j=cd.start ;j<=n;j++)huff_code[i].bits[j]=cd.bits [j];huff_code[i].start =cd.start ;}/*输出字符的哈弗曼编码*/puts("the hafman code are:");for(i=0;i<n;i++){for(j=huff_code[i].start;j<=n;j++)printf("%10d",huff_code[i].bits [j]);printf("/n");}puts("press any key to quit...");}三、运行界面please input the leaf num of tree:8please input the weight of every leaf 1 2 3 4 5 6 7 1输出:11010 1100 100 101 1110001 11011。
哈夫曼解码
《哈夫曼编码》是由德国工程师和数学家卡尔哈夫曼发明的一种著名的无损数据压缩编码方式。
它是以数据文件中出现次数最多的字符编码为主,使用更短的位数,用以减少文件的大小。
哈夫曼编码的作用是能够将原本的编码数据进行压缩,使得例如传输效率、存储空间等受益。
哈夫曼编码是一种先进的编码方式,根据哈夫曼定理,它能够达到最小最优效果,使得文件可以被有效地压缩,从而节省更多的存储空间和传输时间。
而且哈夫曼编码是可逆的,因此文件接收者可以快速地将接收的文件还原成原本的格式。
哈夫曼编码是一种动态程序,它能够根据数据文件中出现次数最多的字符采用编码,以更短的位数来存储,从而压缩文件的大小。
它通过根据文件中字符的出现频率,利用贪心算法和二叉树原理,通过动态程序来构建哈夫曼树。
在构建哈夫曼树的同时,它也以左右孩子的方式编码,左孩子用0表示,右孩子用1表示。
哈夫曼编码能够发挥出优质效果,因此在日常使用领域得到了广泛应用。
例如GIF图片文件就采用了哈夫曼编码,它能够根据文件中数据的出现概率编码,从而节省大量的存储空间,使得文件体积变得更小。
此外,哈夫曼编码还可以用于视频文件的编码,以提高传输的流畅度,减少在线视频的卡顿状况。
哈夫曼编码是一种非常实用的编码方式,它利用了数据统计和逻辑算法,使得文件体积可以达到最小状态,从而节省更多的存储空间
和传输时间。
哈夫曼编码是一种普及的无损数据压缩编码,在计算机领域及其他电子领域得到了大量应用,为人们的生活提供了极大的便利。
(1)哈夫曼编码所形成的码字不是唯一的,但编码效率是唯一的在对最小的两个概率符号赋值时,可以规定为大的为“1”、小的为“0”,反之也可以。
如果两个符号的出现概率相等时,排列时无论哪个在前都是可以的,所以哈夫曼所构造的码字不是唯一的,对于同一个信息源,无论上述的前后顺序如何排列,它的平均码长是不会改变的,所以编码效率是唯一的。
(2)只有当信息源各符号出现的概率很不平均的时候,哈夫曼编码的效果才明显。
(3)哈夫曼编码必须精确地统计出原始文件中每个符号的出现频率,如果没有这些精确的统计,将达不到预期的压缩效果。
霍夫曼编码通常要经过两遍操作,第一遍进行统计,第二遍产生编码,所以编码速度相对慢。
另外实现的电路复杂,各种长度的编码的译码过程也是比较复杂的,因此解压缩的过程也比较慢。
(4)哈夫曼编码只能用整数来表示单个符号而不能用小数,这很大程度上限制了压缩效果。
(5)哈夫曼所有位都是合在一起的,如果改动其中一位就可以使其数据变得面目全非运动估计基本思想是将图像序列的每一帧分成许多互不重叠的宏块,并认为宏块内所有象素的位移量都相同,然后对每个宏块到参考帧某一给定特定搜索范围内根据一定的匹配准则找出与当前块最相似的块,即匹配块,匹配块与当前块的相对位移即为运动矢量。
视频压缩的时候,只需保存运动矢量和残差数据就可以完全恢复出当前块。
常见的运动估计匹配准则有三种:MAD、MSE和NCCF,由于MAD没有乘除操作,不需做乘法运算,实现简单方便,所以使用较多。
通常使用求和绝对误差(SAD)代替MAD 。
运动估计和运动补偿是AVS 中去除时间冗余的主要方法,它采用多种宏块划分方式,1P4 像素插值、双向估计和多参考帧等技术大大提高了编码效率,但同时也给编解码器增加了一定的复杂度。
运动估计和运动补偿作为视频压缩编码系统的核心算法,占整个系统运算量的60%-80%。
研究运动估计算法的DSP实现对整个H.264系统的嵌入式应用具有重要的指导意义。
1.哈夫曼编码的方法编码过程如下:<1> 将信源符号按概率递减顺序排列;<2> 把两个最小的概率加起来, 作为新符号的概率;<3> 重复步骤<1> 、<2>, 直到概率和达到1 为止;<4> 在每次合并消息时,将被合并的消息赋以1和0或0和1;<5> 寻找从每个信源符号到概率为1处的路径,记录下路径上的1和0;<6> 对每个符号写出"1"、"0"序列〔从码数的根到终节点〕.2.哈夫曼编码的特点①哈夫曼方法构造出来的码不是唯一的 .原因·在给两个分支赋值时, 可以是左支< 或上支> 为0, 也可以是右支< 或下支> 为0, 造成编码的不唯一.·当两个消息的概率相等时, 谁前谁后也是随机的, 构造出来的码字就不是唯一的.②哈夫曼编码码字字长参差不齐, 因此硬件实现起来不大方便.③哈夫曼编码对不同的信源的编码效率是不同的.·当信源概率是2 的负幂时, 哈夫曼码的编码效率达到100%;·当信源概率相等时, 其编码效率最低.·只有在概率分布很不均匀时, 哈夫曼编码才会收到显著的效果, 而在信源分布均匀的情况下, 一般不使用哈夫曼编码.④对信源进行哈夫曼编码后, 形成了一个哈夫曼编码表.解码时, 必须参照这一哈夫编码表才能正确译码.·在信源的存储与传输过程中必须首先存储或传输这一哈夫曼编码表在实际计算压缩效果时, 必须考虑哈夫曼编码表占有的比特数.在某些应用场合, 信源概率服从于某一分布或存在一定规律< 这主要由大量的统计得到>, 这样就可以在发送端和接收端固定哈夫曼编码表, 在传输数据时就省去了传输哈夫曼编码表, 这种方法称为哈夫曼编码表缺省使用.使用缺省的哈夫曼编码表有两点好处:·降低了编码的时间, 改变了编码和解码的时间不对称性;·便于用硬件实现, 编码和解码电路相对简单.这种方法适用于实时性要求较强的场合.虽然这种方法对某一个特定应用来说不一定最好, 但从总体上说, 只要哈夫曼编表基于大量概率统计,其编码效果是足够好的.3.哈夫曼编码举例现在有8个待编码的符号M0,….,M0 它们的概率如下表所示,使用霍夫曼编码算法求出8个符号所分配的代码.〔写出编码树〕待编码的符号概率M00.2M10.4M20.1M30.15M40.03M50.04M60.07M70.01解:为了进行哈夫曼编码, 先把这组数据由大到小排列, 再按上方法处理〔1〕将信源符号按概率递减顺序排列.〔2〕首先将概率最小的两个符号的概率相加,合成一个新的数值.〔3〕把合成的数值看成是一个新的组合符号概率,重复上述操作,直到剩下最后两个符号.5.4.2 Shannon-Famo编码Shannon-Famo<S-F> 编码方法与Huffman 的编码方法略有区别, 但有时也能编出最佳码. 1.S-F码主要准则符合即时码条件;在码字中,1 和0 是独立的, 而且是< 或差不多是>等概率的.这样的准则一方面能保证无需用间隔区分码字,同时又保证每一位码字几乎有1位的信息量. 2.S-F码的编码过程信源符号按概率递减顺序排列;把符号集分成两个子集, 每个子集的概率和相等或近似相等;对第一个子集赋编码"0", 对第二个子集赋编码"1";重复上述步骤, 直到每个子集只包含一个信源符号为止.5.4.3 游程编码游程编码<简写为RLE或RLC>是一种十分简单的压缩方法,它将数据流中连续出现的字符< 称为游程> 用单一的记号来表示.例如,字符串a b a C C C b b a a a a可以压缩为a b a 3c 2b 4a游程编码的压缩效果不太好, 但由于简单, 编码/ 解码的速度非常快, 因此仍然得到广泛的应用.许多图形和视频文件, 如 .BMP,.TIF 与 .AVI 等, 都使用了这种压缩.5.4.4 算术编码1.算术编码算术编码把一个信源集合表示为实数线上的0 到1 之间的一个区间.这个集合中的每个元素都要用来缩短这个区间.信源集合的元素越多,所得到的区间就越小,当区间变小时,就需要更多的数位来表示这个区间,这就是区间作为代码的原理.算术编码首先假设一个信源的概率模型,然后用这些概率来缩小表示信源集的区间.2.举例说明算术编码过程[ 例]设英文元音字母采用固定模式符号概率分配如下:字符 a e i o u概率0.2 0.3 0.1 0.2 0.2范围[0,0.2] [0.2,0.5] [0.5,0.6] [0.6,0.8] [0.8,1.0]设编码的数据串为eai .令high 为编码间隔的高端,low 为编码间隔的低端, range 为编码间隔的长度,rangelow 为编码字符分配的间隔低端,rangehigh 为编码字符分配的间隔高端.初始high=1,low=0,range=high-low, 一个字符编码后新的low 和high 按下式计算:·low =low+range × rangelow·high =low+range×rangehigh<1> 在第一个字符e 被编码时,e 的rangelow=0.2,rangehigh=0.5, 因此: low=0 + 1 × 0.2 =0.2high=0 + 1 × 0.5 =0.5range=high-low=0.5-0.2=0.3此时分配给e 的范围为[0.2,0.5] .<2>第二个字符a 编码时使用新生成范围[0.2,0.5],a 的rangelow=0, rangehigh=0.2, 因此:low=0.2 十0.3 × 0=0.2high=0.2 +0.3 × 0.2=0.26range=0.06范围变成[0.2,0.26] .<3> 对下一个字符i 编号,i 的rangelow=0.5,rangehigh=0.6, 则:low=0.2 +0.06 × 0.5=0.23high=0.2 +0.06 × 0.6=0.236即用[0.23,0.236] 表示数据串eai, 如果解码器知道最后范围是[0.23,0.236 ]这一范围, 它马上可解得一个字符为e, 然后依次得到惟一解a, 即最终得到eai .3.算术编码的特点①不必预先定义概率模型, 自适应模式具有独特的优点;②信源符号概率接近时, 建议使用算术编码, 这种情况下其效率高于Huffman 编码;③算术编码绕过了用一个特定的代码替代一个输入符号的想法, 用一个浮点输出数值代替一个流的输入符号, 较长的复杂的消息输出的数值中就需要更多的位数.④算术编码实现方法复杂一些, 但JPEG 成员对多幅图像的测试结果表明, 算术编码比Huffman 编码提高了5% 左右的效率, 因此在JPEG 扩展系统中用算术编码取代Huffman 编码.。
算术编码的发展和研究热点一、简单介绍。
哈夫曼编码是一种常用的数据压缩编码方法,是哈夫曼于1952年为压缩文本文件提出的一种变长编码方法。
它的基本思想是对出现概率大的符号分配短字长的二进制代码,对出现概率小的符号则分配长字长的二进制代码,从而最终得到每个符号码字平均码长最短的码。
因此对每一个输入符号都对应一个码字,而且该输入符号的出现概率必须是2的整数次幂,对应的码字字长必须是整数比特。
算术编码(ARITHMETIC CODING)是利用信源统计特性对码率进行无损压缩的一种编码方式,属于熵编码范畴,实现算术编码首先需要知道信源发出每个符号的概率大小,然后再扫描符号序列,依次分割相应的区间,最终得到符号序列所对应的码字。
整个编码需要两个过程,即概率模型建立过程和扫描编码过程。
其编码的目的是为了最大程度的降低符号间冗余度,从而获得尽可能高的压缩效率。
早在上个世纪60年代,Abralnson就根据信息论中信源序列积累概率的概念提出了算术编码的基本思想,虽然它的编码效率非常理想,接近于最佳的编码效率,但由于计算精度的问题,直到70年代中期算术编码一直停留在理论阶段。
此后RubinGuazsanen和Langd等人对算术编码做出了不断改进,算术编码进入实用阶段,1987年IanH.witen等人公布了现代多符号算术编码的第一个纯软件版本,算术编码才逐渐得以比较广泛应用。
目前在不少的数据压缩领域都在应用算术编码,例如英文文件编码(领域)、活动图像和目前最新的H264视频压缩编译码标准和静止图像(JPEG压缩标准) 压缩编码领域。
下面简要的说明其编码原理,并与目前广泛应用的huffman编码做全面的比较,以此来说明算术编码的先进性,优越性。
算术编码的基本思想是用一个特定的代码来代替整串输入符号,并不为每个输入符号都产生一个单独的代码,而是为整个一条消息产生一个代码。
任何增加到消息中的每一个符号,都会提高代表该消息的浮点数值精度,这就需要更多的比特数来记录该浮点数值。
安徽大学本科毕业论文(设计、创作)题目:哈夫曼编码与算术编码压缩效率比较学生姓名:李伟学号:E20714134院(系):计算机科学与技术专业:软件工程入学时间:2007年9月导师姓名:韩莉职称/学位:讲师/硕士导师所在单位:安徽大学计算机科学与技术学院完成时间:2011年5月哈夫曼编码与算术编码压缩效率比较摘要算术编码和哈夫曼编码都利用信源符号的概率分布特性进行编码,使平均码长逼近信息熵是压缩编码算法的第一要求,算术编码比哈夫曼编码逼近信息熵的能力要强,但是编码效率和实现往往是一对矛盾,编码效率的提高,往往要在实现上付出代价,所以,选择压缩算要权衡这两点。
本论文开篇先引入了信息论的一些概念,因为编码理论发源于信息论,是各种编码算法的数学基础。
然后在第2章分析了算术编码原理,并从无限精度的算术编码原理过渡到在计算机上能够实现的二进制编码原理。
在第3章紧接着介绍了哈夫曼编码原理,并讨论了怎样把信源符号映射为对应的码字,过程中用到的哈夫曼编码表是编码与解码的关键。
在第4章对两者的编码效率作了比较,主要是结合信息论中的一些概念从微观上对两者逼近信息熵的能力作了比较,并在这章最后对两者在文本文件的压缩效果的表现上给出了一些实验结果。
最后,在5章,主要是对前面内容做了些补充和总结。
关键词:信息熵;算术编码;哈夫曼编码;编码效率The comparison of Huffman Coding and Arithmetic Coding in FileCompressionAbstractFull use of the probability distribution of source symbols is the feature of the arithmetic encoding and Huffman encoding. Approaching the average code length to the information entropy come first when designing a compression algorithm. To the capacity of closing to information entropy, arithmetic encoding is stronger than Huffman encoding. However, the coding efficiency and implementation is often a contradiction: to improve coding efficiency, which means the algorithm implementation process needs to pay a higher price. Therefore, you need to weigh both when choosing a compression algorithm. In the beginning of this thesis, it first introduced some of the concepts of information theory. Because encoding algorithms are derived from information theory and information theory is the mathematical foundation of various coding algorithms. Then in Chapter 2, it introduces the principle of arithmetic coding. For better to understand the binary arithmetic coding principle, it first introduces the unlimited precision arithmetic coding. In Chapter 3, it describes the Huffman coding theory, and discusses how to map source symbol to the corresponding code word, among which Huffman coding and decoding table is the key. In Chapter 4, the coding efficiency of the two algorithms is compared. Mainly compare the capacities to approximate information entropy with some of the concepts in information theory. And the final part in this chapter, some experimental results are given to show the compression effect to compress a text file. Finally, in Chapter 5, it gives some additions and summary.Keywords:Information Entropy; Arithmetic Coding; Huffman Coding;Coding Efficiency目录1 引言 (1)1.1 数据压缩概念及技术分类 (1)1.2 统计编码的数学准备 (2)1.3 统计编码简介 (5)2 算术编码 (5)2.1 算术编码简介 (5)2.2 无限精度的算术编码 (6)2.3 二进制编码 (9)2.4 二进制解码 (13)3 哈夫曼编码 (14)3.1 哈夫曼编码简介 (14)3.2 哈夫曼编码原理 (14)3.3 哈夫曼解码原理 (16)3.4 哈夫曼编码与解码系统模型 (16)3.5 哈夫曼编码形式不唯一 (17)4 算术编码与哈夫曼编码的比较 (17)4.1 两者编码效率的比较 (17)4.2 两者压缩率的比较 (19)5 总结 (20)主要参考文献 (22)致谢 (23)1引言1.1数据压缩概念及技术分类数据压缩,就是将信息的一种表示方式转换为另一种表示方式,信息的新的表示方式与原有表示方式相比较所含的信息量相同或是在可以承受的范围内有所损失,但是新的表示方式所用到的符号数量要比原有表示方式要尽可能的少。
数据压缩是必要的,不管是在生物系统中还是在人工系统中都存在数据压缩。
尤其是处在这个信息爆炸的时代,怎样更有效的存储信息和传递信息对于文明进步的作用都是显而易见的。
从不同视角看到的数据压缩的益处有:在通信信道上更快的传输信息,这就相应的减少了信道的占有时间,这可看作在时间上进行了压缩;在同一通信信道上并行的传输各种频率的互不干扰的信息,如xDSL 技术在普通电话线上实现把低端频谱留给传统电话使用,把高端频谱留给上网用户使用,这可看作在频率域上进行了压缩;传输信号当然需要能量消耗,因此对数据进行压缩也就间接地减少了能量消耗,这可看作是在能量上进行了压缩;各种存储系统的存储空间都不是无限的,对数据进行压缩后,就可以在同样的存储空间存储更多的数据,这可看作是空间上的压缩。
任何系统,尤其在活动时,都同时涉及到时间、空间和能量上的消耗,所以数据压缩就是从这三方面同时进行了压缩,这样就使得系统更加的有效的运行。
既然数据压缩是必要的,那么就要考虑从哪些方面来说数据可以被压缩,一般可从以下几方面考察:一是,数据中通常存在着多余成分,即允余度。
例如,存储在计算机上的一份文本文件,内容可假设是一部英文小说,可以想象,26个英文字母重复出现,各个字母出现的频率有大有小,而且不仅字母重复出现,字母组成的单词也重复出现,进一步,某些字母总是在某单词的一定位置上以高概率重复出现,某些单词也总是在一个特定句式的特定位置以高概率重复出现等等,计算机是以二进制形式存储文件的,那么用二进制符号怎样有效的表示这个由英文字符、各种标点符号和控制字符组成的文本文件就是怎样对数据进行压缩的问题,而压缩显然就要利用这些允余度的不同类型,例如,我们赋予高概率字符以相对少的二进制位数,赋予低概率字符以相对多的的二进制位数,那么这样表示后所得的总的二进制位数肯定比不考虑各个字符出现概率,而给不同字符按照ASCII码分配二进制位数所得的总的二进制位数要少很多。
二是,数据中的各个部分前后之间总是存在着相关性。
例如,电视上显示的动态画面,实际上是由离散的不同画面(帧)组成的,之所以看似是连续的只是因为帧的播放速度超过了人类的反应速度并且利用了人类的视觉暂留效应,但为使画面看似连续,不仅要利用人类本身的生物特性,还要保证帧之间的过渡是相对平滑的,也就是相邻两帧之间只有动态上的细微变化,而大部分画面在两帧之间是相同的,很显然,这种相关性是可以很好的加以利用的。
三是,对于人而言,我们的感受器只能接受外界中很小一部分的信息。
例如,人眼只能感受阳光中的可见光,而对紫外光不可见,但一些昆虫如蜜蜂却能感受紫外光,如果人为的屏蔽掉紫外光部分,对人眼而言,我们并不能对屏蔽前与屏蔽后的阳光加以区分,但蜜蜂就不同了,可能就因为无法感受紫外光,就找不到花蜜了,所以,对于人而言,并不是数据中所有的信息对我们都是必要的,不必要的部分就可以屏蔽掉。
数据压缩可分为无损压缩和有损压缩,下面分别简要的介绍可逆压缩和不可逆压缩:可逆压缩,是利用数据的统计特性,即数据的允余度进行压缩的一类方法,允余度的去除或是减少并不影响原始数据无失真的恢复,即是一个可逆的过程。
但从编码效率上来讲,可逆压缩受到待编码数据本身的信息熵的限制,无法达到更高的编码效率。
也就是由于这样的限制,仅使用可逆压缩方法是不可能解决多媒体的存储和传输的所有问题的,因此,这类方法一般适用于在压缩过程中不允许有丝毫损失的情况,如在计算机磁盘上存储文件,数据通信等领域。
常用的可逆压缩方法有:哈夫曼编码、算术编码、LZW 编码等。
不可逆压缩,是利用人类对图像或声波中的某些频率成分的不敏感特性,允许压缩过程中损失一定的信息,虽然不能完全恢复原始数据,但是所损失的部分对人类理解理解原始数据的影响可承受,好处就是与可逆压缩相比,能够获得更高的编码效率,因此,广泛适用与语音、图像和视频数据的压缩。
不可逆压缩的方法有很多,这里不列举。
1.2 统计编码的数学准备统计编码某种程度上与可逆压缩同义,因此可混用。