哈夫曼的编码

作者&投稿:一诸 (若有异议请与网页底部的电邮联系)
哈夫曼编码是什么?~


哈夫曼在上世纪五十年代初就提出这种编码时,根据字符出现的概率来构造平均长度最短的编码。它是一种变长的编码。在编码中,若各码字长度严格按照码字所对应符号出现概率的大小的逆序排列,则编码的平均长度是最小的。(注:码字即为符号经哈夫曼编码后得到的编码,其长度是因符号出现的概率而不同,所以说哈夫曼编码是变长的编码。) 而且哈夫曼编码是按照子树到父亲,而其读码则是完全相反的。 因此,后来有人提出了一种动态的哈夫曼编码方法。动态哈夫曼编码使用一棵动态变化的哈夫曼树,对第t+1个字符的编码是根据原始数据中前t个字符得到的哈夫曼树来进行的,编码和解码使用相同的初始哈夫曼树,每处理完一个字符,编码和解码使用相同的方法修改哈夫曼树,所以没有必要为解码而保存哈夫曼树的信息。编码和解码一个字符所需的时间与该字符的编码长度成正比,所以动态哈夫曼编码可实时进行。动态哈夫曼编码比静态哈夫曼编码复杂的多,有兴趣的读者可参考有关数据结构与算法的书籍。
前面提到的JPEG中用到了哈夫曼编码,并不是说JPEG就只用哈夫曼编码就可以了,而是一幅图片经过多个步骤后得到它的一列数值,对这些数值进行哈夫曼编码,以便存储或传输。哈夫曼编码方法比较易懂,大家可以根据它的编码方法,自己编写哈夫曼编码和解码的程序。
哈夫曼树的构造算法。
const maxvalue= 10000; {定义最大权值}
maxleat=30; {定义哈夫曼树中叶子结点个数}
maxnode=maxleaf*2-1;
type HnodeType=record
weight: integer;
parent: integer;
lchild: integer;
rchild: integer;
end;
HuffArr:array[0..maxnode] of HnodeType;
var ……
procedure CreatHaffmanTree(var HuffNode: HuffArr); {哈夫曼树的构造算法}
var i,j,m1,m2,x1,x2,n: integer;
begin
readln(n); {输入叶子结点个数}
for i:=0 to 2*n-1 do {数组HuffNode[ ]初始化}
begin
HuffNode.weight=0;
HuffNode.parent=-1;
HuffNode.lchild=-1;
HuffNode.rchild=-1;
end;
for i:=0 to n-1 do read(HuffNode.weight); {输入n个叶子结点的权值}
for i:=0 to n-1 do {构造哈夫曼树}
begin
m1:=MAXVALUE; m2:=MAXVALUE;
x1:=0; x2:=0;
for j:=0 to n+i-1 do
if (HuffNode[j].weight<m1) and (HuffNode[j].parent=-1) then
begin m2:=m1; x2:=x1;
m1:=HuffNode[j].weight; x1:=j;
end
else if (HuffNode[j].weight<m2) and (HuffNode[j].parent=-1) then
begin m2:=HuffNode[j].weight; x2:=j; end;
{将找出的两棵子树合并为一棵子树}
HuffNode[x1].parent:=n+i; HuffNode[x2].parent:=n+i;
HuffNode[n+i].weight:= HuffNode[x1].weight+HuffNode[x2].weight;
HuffNode[n+i].lchild:=x1; HuffNode[n+i].rchild:=x2;
end;
end;






什么是哈夫曼编码?
哈夫曼编码是一种编码方式,它是一种线性的前缀编码方式,它利用了信源符号的统计特性,将出现概率高的符号用短码编码,出现概率低的符号用长码编码。这样可以使得编码后的平均码长最短,可以最大化压缩效果。哈夫曼编码是1952年由David A. Huffman提出的,通常使用哈夫曼树来实现。哈夫曼树是一种带权...

哈夫曼编码是什么?
哈夫曼编码是在哈夫曼树的基础上进行的,其编码步骤为:(1)利用字符集中每个字符的使用频率作为权值构造一个哈夫曼树,并在叶子结点上注明对应的字符。(2)在树中从根结点到叶子结点都有一条路径,对路径上的各分支约定指向左子树根的分支表示“0”码,指向右子树的分支表示“1”码。(2)取从根...

哈夫曼的编码
(注:码字即为符号经哈夫曼编码后得到的编码,其长度是因符号出现的概率而不同,所以说哈夫曼编码是变长的编码。) 而且哈夫曼编码是按照子树到父亲,而其读码则是完全相反的。 因此,后来有人提出了一种动态的哈夫曼编码方法。动态哈夫曼编码使用一棵动态变化的哈夫曼树,对第t+1个字符的编码是...

如何理解哈夫曼编码?
5、则m-s的数值就是m进制哈夫曼编码第一部所需要取的符号个数。(既然我们与理想状况相差s个,那我们第一步就用m-s个进行编码吧)k其实就是信源缩减的次数。说的有点绕,理一理思路我再回来更口语化地修改答案。例题:信源有8个信源符号,所以X = 3 + 2 * 3 = 9 > 8 理想情况下是9个...

哈夫曼编码怎么算
4、进行哈夫曼编码:在得到哈夫曼编码表后,就可以对源数据进行哈夫曼编码了。具体方法是按照哈夫曼编码表中的映射关系,将源数据中的每个符号替换为其对应的哈夫曼编码,从而得到压缩后的数据。使用哈夫曼编码的优点有:1、高压缩比:哈夫曼编码是一种可变长度的编码方法,可以根据数据集中不同符号的出现...

赫夫曼树及赫夫曼编码
在1952年美国数学家发明了赫夫曼编码,当时是为了解决远距离通信(主要是电报)的数据传输最优化问题,节约存储和传送的成本。后人为纪念他的成就,就把他在编码中用到的二叉树称为赫夫曼树,别名最优二叉树。他的编码方法称为赫夫曼编码。我们平时所用的压缩和解压缩技术也是基于赫夫曼的研究之上而来。路...

赫夫曼编码的平均码长是多少?
平均码长=(4*0.09+3*0.15+4*0.04+4*0.07+2*0.28+4*0.08+2*0.21+3*0.18)\/1.1=2.81。假设有n个权值,则构造出的哈夫曼树有n个叶子结点。n个权值分别设为 w1、w2、wn,则哈夫曼树的构造规则为:(1) 将w1、w2、wn看成是有n 棵树的森林(每棵树仅有一个结点);(2) 在...

Huffman(霍夫曼)编码是如何运算的?
霍夫曼编码具有一些明显的特点:1) 编出来的码都是异字头码,保证了码的唯一可译性。2) 由于编码长度可变。因此译码时间较长,使得霍夫曼编码的压缩与还原相当费时。3) 编码长度不统一,硬件实现有难度。4) 对不同信号源的编码效率不同,当信号源的符号概率为2的负幂次方时,达到100%的编码效率;...

哈夫曼编码
哈夫曼编码(Huffman Coding)是一种编码方式,以哈夫曼树—即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。 在计算机信息处理中,“哈夫曼编码”是一种一致性编码法(又称"熵编码法"),用于数据的无损耗压缩。这一术语是指使用一张特殊的编码表将源字符(例如某文件中的一个符号)...

三种编码方式的比较
二、哈夫曼编码 概念:哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。哈...

路桥区17741817707: 哈夫曼编码 - 搜狗百科
伏飘枸橼: 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种.Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码).

路桥区17741817707: 哈夫曼编码是什么?、 -
伏飘枸橼: 哈夫曼编码(Huffman Coding)是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种. Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长 度最短的码字,有时称之为最佳编码,一般就叫作...

路桥区17741817707: 哈夫曼编码码长怎么算 -
伏飘枸橼:[答案] 假设用于通信的电文由字符集{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个字母进行等长编码,则哈夫曼编...

路桥区17741817707: 哈夫曼编码 -
伏飘枸橼: //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<=...

路桥区17741817707: 如何叙述哈夫曼编码 -
伏飘枸橼: 哈夫曼编码 哈夫曼树可用于构造最短的不等长编码方案,具体做法如下:设需要编码的字符集合为{d1,d2,…,d¬n},它们在字符串中出现的频率为{w1, w2,…, wn},以d1,d2,…,d¬n作为叶子结点, w1, w2,…, wn¬作为叶子结点的权值,构造一颗...

路桥区17741817707: 哈夫曼编码原理 -
伏飘枸橼: 霍夫曼(Huffman)编码属于码词长度可变的编码类,是霍夫曼在1952年提出的一种编码方法,即从下到上的编码方法.同其他码词长度可变的编码一样,可区别的不同码词的生成是基于不同符号出现的不同概率.生成霍夫曼编码算法基于一种称...

路桥区17741817707: 求哈夫曼编码,谢谢! -
伏飘枸橼: 完整的程序 #include #include #include #define NULL 0 typedef struct huff_code_node //存储编码的链表 { char ch; //编码对应的字符 char code[100]; //字符对应的哈夫曼码 struct huff_code_node *next; }hnode,*huff; typedef struct tree_Node //二叉...

路桥区17741817707: 霍夫曼编码的思想是什么 -
伏飘枸橼: 哈夫曼编码(Huffman Coding)是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种.uffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长 度最短的码字,有时称之为最佳编码,一般就叫作Huffman...

路桥区17741817707: 写出构造完整的哈夫曼树的编码 -
伏飘枸橼: void HuffmanCoding(HuffmanCode HC[], int w[], int n) // w存放n个字符的权值(均>0),构造哈夫曼树HT, 并求出n个字符的哈夫曼编码HC {int i, j;char *cd;int start; if (n<=1) return;m = 2 * n - 1;HT = (HuffmanTree)malloc((m+1) * sizeof(...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网