• 回答数

    4

  • 浏览数

    281

艾米tiantian
首页 > 学术论文 > 哈夫曼编码原理与实现毕业论文

4个回答 默认排序
  • 默认排序
  • 按时间排序

真巧穆斯林

已采纳

霍夫曼(Huffman)编码属于码词长度可变的编码类,是霍夫曼在1952年提出的一种编码方法,即从下到上的编码方法。同其他码词长度可变的编码一样,可区别的不同码词的生成是基于不同符号出现的不同概率。生成霍夫曼编码算法基于一种称为“编码树”(coding tree)的技术。算法步骤如下:(1)初始化,根据符号概率的大小按由大到小顺序对符号进行排序。(2)把概率最小的两个符号组成一个新符号(节点),即新符号的概率等于这两个符号概率之和。(3)重复第2步,直到形成一个符号为止(树),其概率最后等于1。(4)从编码树的根开始回溯到原始的符号,并将每一下分枝赋值为1,上分枝赋值为0。以下这个简单例子说明了这一过程。1).字母A,B,C,D,E已被编码,相应的出现概率如下: p(A)=, p(B)=, p(C)=, p(D)=, p(E)=).C和E概率最小,被排在第一棵二叉树中作为树叶。它们的根节点CE的组合概率为。从CE到C的一边被标记为1,从CE到E的一边被标记为0。这种标记是强制性的。所以,不同的哈夫曼编码可能由相同的数据产生。3).各节点相应的概率如下: p(A)=, p(B)=, p(CE)=, p(D)= D和A两个节点的概率最小。这两个节点作为叶子组合成一棵新的二叉树。根节点AD的组合概率为。由AD到A的一边标记为1,由AD到D的一边标记为0。 如果不同的二叉树的根节点有相同的概率,那么具有从根到节点最短的最大路径的二叉树应先生成。这样能保持编码的长度基本稳定。4).剩下节点的概率如下:p(AD)=, p(B)=, p(CE)=和CE两节点的概率最小。它们生成一棵二叉树。其根节点ADCE的组合概率为。由ADCE到AD一边标记为0,由ADCE到CE的一边标记为1。5).剩下两个节点相应的概率如下:p(ADCE)=, p(B)=它们生成最后一棵根节点为ADCEB的二叉树。由ADCEB到B的一边记为1,由ADCEB到ADCE的一边记为0。6).图03-02-2为霍夫曼编码。编码结果被存放在一个表中: w(A)=001, w(B)=1, w(C)=011, w(D)=000, w(E)=010图03-02-2 霍夫曼编码例霍夫曼编码器的编码过程可用例子演示和解释。下面是另一个霍夫曼编码例子。假定要编码的文本是: "EXAMPLE OF HUFFMAN CODE"首先,计算文本中符号出现的概率(表03-02-2)。 表03-02-2 符号在文本中出现的概率符号 概率 E 2/25 X 1/25 A 2/25 M 2/25 P 1/25 L 1/25 O 2/25 F 2/25 H 1/25 U 1/25 C 1/25 D 1/25 I 1/25 N 2/25 G 1/25 空格 3/25 最后得到图03-02-3所示的编码树。图03-02-3 霍夫曼编码树在霍夫曼编码理论的基础上发展了一些改进的编码算法。其中一种称为自适应霍夫曼编码(Adaptive Huffman code)。这种方案能够根据符号概率的变化动态地改变码词,产生的代码比原始霍夫曼编码更有效。另一种称为扩展的霍夫曼编码(Extended Huffman code)允许编码符号组而不是单个符号。同香农-范诺编码一样,霍夫曼码的码长虽然是可变的,但却不需要另外附加同步代码。这是因为这两种方法都自含同步码,在编码之后的码串中都不需要另外添加标记符号,即在译码时分割符号的特殊代码。当然,霍夫曼编码方法的编码效率比香农-范诺编码效率高一些。采用霍夫曼编码时有两个问题值得注意:①霍夫曼码没有错误保护功能,在译码时,如果码串中没有错误,那么就能一个接一个地正确译出代码。但如果码串中有错误,那怕仅仅是1位出现错误,也会引起一连串的错误,这种现象称为错误传播(error propagation)。计算机对这种错误也无能为力,说不出错在哪里,更谈不上去纠正它。②霍夫曼码是可变长度码,因此很难随意查找或调用压缩文件中间的内容,然后再译码,这就需要在存储代码之前加以考虑。尽管如此,霍夫曼码还是得到广泛应用。

144 评论

老王09870

赫夫曼码的码字(各符号的代码)是异前置码字,即任一码字不会是另一码字的前面部分,这使各码字可以连在一起传送,中间不需另加隔离符号,只要传送时不出错,收端仍可分离各个码字,不致混淆。

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

扩展资料

赫夫曼编码的具体方法:先按出现的概率大小排队,把两个最小的概率相加,作为新的概率 和剩余的概率重新排队,再把最小的两个概率相加,再重新排队,直到最后变成1。

每次相 加时都将“0”和“1”赋与相加的两个概率,读出时由该符号开始一直走到最后的“1”, 将路线上所遇到的“0”和“1”按最低位到最高位的顺序排好,就是该符号的赫夫曼编码。

例如a7从左至右,由U至U″″,其码字为1000;

a6按路线将所遇到的“0”和“1”按最低位到最高位的顺序排好,其码字为1001…

用赫夫曼编码所得的平均比特率为:Σ码长×出现概率

上例为:×2+×2+×3+×3+×3+×4+×4= bit

可以算出本例的信源熵为,二者已经是很接近了。

参考资料来源:百度百科-哈夫曼编码

105 评论

优尼makeup

强 楼主这里懂这个的大概不多吧 还是希望楼主能得到解决!!!

110 评论

jessica8918

这是以前写的,可是我不想加注释了,Huffman编码其实原理很简单的,你自己好好学下吧,一句一句注释也太夸张了啊。#include<> #include<> #include<>int m,s1,s2;typedef struct { unsigned int weight; unsigned int parent,lchild,rchild; }HTNode,*HuffmanTree;typedef char ** HuffmanCode;void Select(HuffmanTree HT,int n) { int i,j; for(i=1;i<=n;i++) if(HT[i].parent==0) {s1=i; break; } for(j=i+1;j<=n;j++) if(HT[j].parent==0) { s2=j; break; } for(i=1;i<=n;i++) { if(HT[i].parent==0) if(HT[s1].weight>HT[i].weight) if(s2!=i) s1=i; } for(j=1;j<=n;j++) { if(HT[j].parent==0) if(HT[s2].weight>HT[j].weight) if(s1!=j) s2=j; } if(s1>s2){ int temp=s1; s1=s2; s2=temp;}}void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n) {int i,j;char *cd;int p;int cdlen;if (n<=1) return; m = 2 * n - 1; HT = (HuffmanTree)malloc((m+1) * sizeof(HTNode)); for (i=1; i<=n; i++) { HT[i].weight=w[i-1]; HT[i].parent=0; HT[i].lchild=0; HT[i].rchild=0; } for (i=n+1; i<=m; i++) { HT[i].weight=0; HT[i].parent=0; HT[i].lchild=0; HT[i].rchild=0; } //添加查看,便于调试printf("构造过程显示:\n"); for(i=1;i<=m;i++) printf("%4d%4d%4d%4d%4d\n",i,HT[i].weight, HT[i].parent,HT[i].lchild, HT[i].rchild);system("pause");for(i=n+1;i<=m;i++){ Select(HT,i-1); HT[s1].parent = i; HT[s2].parent = i; HT[i].lchild = s1; HT[i].rchild = s2; HT[i].weight = HT[s1].weight + HT[s2].weight; //添加查看,便于调试 /*printf("s1=%d,s2=%d\n",s1,s2); for(j=1;j<=i;j++) printf("%d%4d%4d%4d",j,HT[j].weight,HT[j].parent,HT[j].lchild, HT[j].rchild); system("pause"); */}cd = (char *)malloc(n*sizeof(char));p=m;cdlen=0;for(i=1;i<=m;i++) HT[i].weight=0;while(p){ if(HT[p].weight==0) { HT[p].weight=1; if(HT[p].lchild!=0) { p=HT[p].lchild; cd[cdlen++]='0'; } else if(HT[p].rchild==0) { HC[p]=(char *)malloc((cdlen+1)*sizeof(char)); cd[cdlen]='\0'; strcpy(HC[p],cd); } } else if(HT[p].weight==1) { HT[p].weight=2; if(HT[p].rchild!=0) { p=HT[p].rchild; cd[cdlen++]='1'; } } else { HT[p].weight=0; p=HT[p].parent; --cdlen; }}}int main(){HuffmanTree HT;HuffmanCode HC;int *w,n,i;printf("请输入节点数:\n");scanf("%d",&n);HC = (HuffmanCode)malloc(n*sizeof(HuffmanCode));w=(int *)malloc(n*sizeof(int));printf("请输入节点的权值:\n");for(i=0;i

204 评论

相关问答

  • 保险原理与实务毕业论文

    关于保险专业毕业的论文 摘要: 目前,高校保险专业建设重理论轻实践,实践教学手段落后,教学师资缺乏,教学质量评价机制缺失,导致实践教学的效果不佳,高校培养出来的

    midnightdq 3人参与回答 2023-12-08
  • 论文查重原理及实现

    论文查重的原理是连续13个字符相似,重复的内容计入论文的重复率。论文查重系统会对内容进行分层处理,按照章、段、句等层次创建指纹。在比较资源库中的对比文献时,采用

    汤汤小朋友 5人参与回答 2023-12-06
  • 霍夫曼的内化理论毕业论文

    在现代经济中“霍夫曼定理”不能得到印证的主要原因是:第一,“霍夫曼定理”是建立在先行工业化国家早期增长模式之上的。在这些国家工业化的早期阶段,经济增长依赖于机器

    浅陌时光 3人参与回答 2023-12-10
  • 毕业论文实验原理

    前 言细胞生物学实验课的教学目的,主要是通过基本技能训练以及观察分析实验结果,使学生了解并掌握有关的实验技术原理和操作方法,进而培养学生动手实践、观察分析和解决

    gaooooo汪汪 5人参与回答 2023-12-12
  • 领导科学与小曼编辑

    《领导科学》为如何当好一个领导做准备,很有高度。《公务员文萃》为一般的公务员特别是秘书很有帮助。《乡镇论坛》对于到农村基层的公务员增长知识快速成长最有帮助。《杂

    小L快跑 5人参与回答 2023-12-08