关于哈夫曼编码
关于哈夫曼编码,是从摩尔斯电码说起的,这种电码是用点(嘀)和长线(嗒)对英文的26个字母进行编码的,按照对信息度量的方法,如果对26个字母采用等长度析编码,比如进行进制编码就需要log26(这里的log函数是以2为底的),也就是约5比特信息,而采用摩尔斯电码的方法,平均只需要3比特,这样效率就高了很多,发报时间也节省了大约1/3左右。
在战争时期,能够节省发电报的时间对情报人员的安全是很重要的,因为谍战片里情报人员没法完电报就被别人闯进来带走的情形在现实中是真的很常见的,尤其是在二战时期欧洲的德占区。另外就算是除去战争的因素,能够节省1/3的发报成本也是一个很大的改进。
但是,如果按照哈夫曼编码的方法来看摩尔斯电码,就会发现虽然摩尔斯电码不自觉的采用了哈夫曼编码的方法,但还不是最简洁的编码方法,依然有改进的空间。
事实证明,越长出现的信息采用较短的编码,不常出现的信息采用较长的编码相比于所有信息都采用相同长度编码的方法更合算的。我们可以按照这样一个推倒步骤来看一下:
(对于我个人来讲,虽然数学学得不怎么样,但是这种推导过程我还是很喜欢的,因为通过自己动手来将一个结论推导出来时间很开心的事。)
哈夫曼编码从本质上讲就是讲最宝贵的资源(最短的编码)给出现概率最大的信息。而至于如何分配,其中的一个原则就是一条信息编码的长度和出现概率的对数成正比。 按我的理解就是出现的概率越大,投入的资源就越多。
那么哈夫曼编码的原则对于我们有什么用处呢?可以这样讲,只要是需要分配资源的工作,它都有指导意义。
课程中给我印象最深就是美国私立学校哈克学校的前校长尼科诺夫博士的一句话:在孩子小时候,要让他们尝试各种兴趣爱好,但是最终他们要在一个点上实现突破,就好比用圆规画圆,一方面有一个扎得很深的中心,另一方面有足够广的很浅的覆盖面。我觉得这是我能够听明白并且能够实践应用的最简单直接的方法。而且吴军老师就是用哈夫曼编码的方法来指导行动的,不排斥尝试新东西,但也对那些看样子不太能做成的事坚决停止投入,然后将更多的精力投入到成功率最高的事情上。
吴军老师有句话很好,“理论不在学得多,而在于学以致用”。而我们大多数人都是学得多,用得少,我也是一样。也许我可以从学着用哈夫曼编码开始,试着将学到的理论指导实践,踏踏实实的往前走。
哈夫曼编码的原理是什么?
从图(a)和(b)可以看出,两者虽平均码长相等,但同一符号可以有不同的码长,即编码方法并不唯一,其原因是两支路概率合并后重新排队时,可能出现几个支路概率相等,造成排队方法不唯一。一般,若将新合并后的支路排到等概率的最上支路,将有利于缩短码长方差,且编出的码更接近于等长码。这里图(...
哈夫曼编码(贪心算法)
参考: 哈夫曼编码 哈夫曼编码是一种十分有效的编码方法,广泛应用于 数据压缩 中 通过采用 不等长 的编码方式,根据 字符频率的不同 ,选择 不同长度的编码 ,对频率 越高 的字符采用 越短 的编码实现数据的高度压缩。 这种对频率越高的字符采用越短的编码来编码的方式应用的就是贪心算法的...
有人听说过哈夫曼三进制编码吗?
3、取一个使X>=Q的k,k可以取无数多个,但是我们取其中的最小值。4、s = X - Q (这一步的目的是:计算我们目前拥有的符号数目与每一步都用3个符号进行编码时所需要的符号数目相差多少个)5、则m-s的数值就是m进制哈夫曼编码第一部所需要取的符号个数。(既然我们与理想状况相差s个,那...
哈夫曼编码与译码(C语言版)
在一次实验课程中,我被要求实现哈夫曼树、哈夫曼编码与译码的C语言版本。代码虽然在当时时间紧迫下完成,但仍有优化空间。重要的是,我处理的是基于频率统计的变长编码,即哈夫曼编码,它利用哈夫曼树将高频字符编码成短码,低频字符编码成长码,以实现数据压缩。实验内容包括统计字符频率、构建哈夫曼树、...
哈夫曼字符编码
每次合并二个最小的概率。一开始:c(0.02) . f(0.03) 最小,合并成一个。 cf (0.05) .并且,左边先编 0,右边编1。再继续合并下去。4,2,5,指1001,01,10111的个数。
哈夫曼树和哈夫曼编码
(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。哈夫曼编码 在数据通信中,需要将传送的文字转换成二进制的字符串,用0,1码的不同排列来表示字符。例如,需传送的报文为“AFTER DATA EAR ARE ART AREA”,这里用到的字符集为“A,E,R,T,F,D”,各字母...
什么是变字长最佳编码原理
哈夫曼编码(Huffman Coding),又称霍夫曼编码 最佳编码定理:在变字长码中,对于出现概率大的信息符号编以短字长的码;对于出现概率小的信息符号编以长字长的码,如果码字长度严格按照符号概率的大小的相反顺序排列,则平均码字长度一定小于按任何其他符号顺序排列方式得到的码字长度。Huffman编码步骤:概率统计...
给定某英文文本,采用哈夫曼编码方法时的总编码长度为___位?
所以对应的所有叶子结点的路径长度 * 出现次数 之和便是总编码长度。WPL = 3 * 3 + 5* (1+1+1+1+1+1) + 4*(2+2+2) + 2*(4 + 4) = 79。哈夫曼编码简介:哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952...
00,100,101,110,111不是哈夫曼编码的原因
如图所示,主要是00出现了问题,a节点没有右儿子,可以看出a节点完全是多余的。b节点的编码直接是0就好了。
哈夫曼编码
我是这么考虑的,仅供参考,个人想法,非标准答案。哈夫曼编码的思想是:出现频率越高其编码越简单,出现频率越少其编码相对复杂。分别记下各字符出现的次数(频率):a:(8)、d:(5)、t:(3)、n:(2)所以作出哈夫曼树如下图,并根据其思想:依次以叶子为出发点,向上回溯至根结点为止。回溯...
矣疫速脲: 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种.Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码).
潜江市17628473934: 如何叙述哈夫曼编码 - ?
矣疫速脲: 哈夫曼编码 哈夫曼树可用于构造最短的不等长编码方案,具体做法如下:设需要编码的字符集合为{d1,d2,…,d¬n},它们在字符串中出现的频率为{w1, w2,…, wn},以d1,d2,…,d¬n作为叶子结点, w1, w2,…, wn¬作为叶子结点的权值,构造一颗...
潜江市17628473934: 哈夫曼编码 - ?
矣疫速脲: //HC是一个字符串数组,HC[i]中保存的是第i字符的编码;n是haffman树的树高 HC=(HuffmanCode)malloc((n+1)*sizeof(char*));//cd是一个临时变量,临时保存编码 cd=(char*)malloc(n*sizeof(char));cd[n-1]='\0'; // 字符串的结束符为0 (0) for(i=1;i<=...
潜江市17628473934: 哈夫曼编码码长怎么算 - ?
矣疫速脲:[答案] 假设用于通信的电文由字符集{a,b,c,d,e,f,g,h}中的字母构成,这8个字母在电文中出现的概率分别为{0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10}.(1)为这8个字母设计哈夫曼编码.(2)若用这三位二进制数(0…7)对这8个字母进行等长编码,则哈夫曼编...
潜江市17628473934: 哈夫曼编码原理 - ?
矣疫速脲: 霍夫曼(Huffman)编码属于码词长度可变的编码类,是霍夫曼在1952年提出的一种编码方法,即从下到上的编码方法.同其他码词长度可变的编码一样,可区别的不同码词的生成是基于不同符号出现的不同概率.生成霍夫曼编码算法基于一种称...
潜江市17628473934: 哈夫曼编码算法 - ?
矣疫速脲: 因为其中一个不能是另一个的前缀 所以只能是1111、1110、1101、1100
潜江市17628473934: 利用哈夫曼编码进行压缩压缩率一般达到多少? - ?
矣疫速脲: 哈夫曼编码压缩率很低的举个例子:用三位二进行数进行的等长编码平均长度为3,而根据哈夫曼树编码的平均码长为: 4*0.07+2*0.19+5*0.02+4*0.06+2*0.32+5*0.03+2*0.21+4*0.10=2.61 2.61/3=0.87=87% 其平均码长是等长码的87%. 所以平均压缩率为13%.所以应该是你算法有问题……
潜江市17628473934: 哈夫曼编码???
矣疫速脲: 哈夫曼树的构造原理,就是先选取概率最小的两个,就是0.02和0.03,相加,得到0.05,同时删去0.02和0.03,然后把0.05放到原来的集合里面,再次选取最小的两个(现在是0.05和0.06)..这样不断进行,直到只剩一个元素为止.. 举个简单例子..生成哈夫曼树之后,左子树为0,右子树为1,根节点不算在内..您的电文哈夫曼编码是:
潜江市17628473934: 关于哈夫曼编码的!!!?
矣疫速脲: #include<iostream> using namespace std; int co[100]; typedef struct node { int data; char ch; struct node *left,*right; struct node *next; }Bnode; void insert(Bnode *L,char ch,int num) { Bnode *p,*q; p=L; while(p->next) { if (num>=p->next->data) p=p->...