族谱网 头条 人物百科

霍夫曼编码

2020-10-16
出处:族谱网
作者:阿族小谱
浏览:840
转发:0
评论:0
历史1951年,霍夫曼和他在MIT信息论的同学得选择是完成学期报告还是期末考试。导师罗伯特·法诺出的学期报告题目是,查找最有效的二进制编码。由于无法证明哪个已有编码是最有效的,霍夫曼放弃对已有编码的研究,转向新的探索,最终发现了基于有序频率二叉树编码的想法,并很快证明了这个方法是最有效的。霍夫曼使用自底向上的方法构建二叉树,避免了次优算法香农-范诺编码的最大弊端──自顶向下构建树。1952年,于论文《一种构建极小多余编码的方法》(AMethodfortheConstructionofMinimum-RedundancyCodes)中发表了这个编码方法。问题定义与解法Fig.1Fig.2霍夫曼编码演算步骤,左右树排列顺序可以加限制或不加限制Fig.3广义给定欲知狭义输入输出目标示例霍夫曼树常处理符号编写工作。根据整组数据中符号出现的频率高低,决定如何给符号编码。如果符号出现的频率越高,则给符...

历史

1951年,霍夫曼和他在MIT信息论的同学得选择是完成学期报告还是期末考试。导师罗伯特·法诺出的学期报告题目是,查找最有效的二进制编码。由于无法证明哪个已有编码是最有效的,霍夫曼放弃对已有编码的研究,转向新的探索,最终发现了基于有序频率二叉树编码的想法,并很快证明了这个方法是最有效的。霍夫曼使用自底向上的方法构建二叉树,避免了次优算法香农-范诺编码的最大弊端──自顶向下构建树。

1952年,于论文《一种构建极小多余编码的方法》( A Method for the Construction of Minimum-Redundancy Codes )中发表了这个编码方法。

问题定义与解法

霍夫曼编码

Fig.1

霍夫曼编码

Fig.2 霍夫曼编码演算步骤, 左右树排列顺序可以加限制或不加限制

霍夫曼编码

Fig.3

广义

给定

欲知

狭义

输入

输出

目标

示例

霍夫曼树常处理符号编写工作。根据整组数据中符号出现的频率高低,决定如何给符号编码。如果符号出现的频率越高,则给符号的码越短,相反符号的号码越长。假设我们要给一个英文单字 "F O R G E T" 进行霍夫曼编码,而每个英文字母出现的频率分别列在 Fig.1 。

演算过程

(一)进行霍夫曼编码前,我们先创建一个霍夫曼树。

最后产生的树状图就是霍夫曼树,参考 Fig.2 。 (二)进行编码

实现方法

数据压缩

实现霍夫曼编码的方式主要是创建一个二叉树和其节点。这些树的节点可以存储在数组里,数组的大小为符号(symbols)数的大小 n ,而节点分别是终端节点(叶节点)与非终端节点(内部节点)。

一开始,所有的节点都是终端节点,节点内有三个字段:

1.符号(Symbol)

2.权重(Weight、Probabilities、Frequency)

3.指向父节点的链接(Link to its parent node)

而非终端节点内有四个字段:

1.权重(Weight、Probabilities、Frequency)

2.指向两个子节点的链接(Links to two child node)

3.指向父节点的链接(Link to its parent node)

基本上,我们用"0"与"1"分别代表指向左子节点与右子节点,最后为完成的二叉树共有 n 个终端节点与 n-1 个非终端节点,去除了不必要的符号并产生最佳的编码长度。

过程中,每个终端节点都包含着一个权重(Weight、Probabilities、Frequency),两两终端节点结合会产生一个新节点, 新节点的权重 是由 两个权重最小的终端节点权重之总和 ,并持续进行此过程直到只剩下一个节点为止。

实现霍夫曼树的方式有很多种,可以使用优先队列(Priority Queue)简单达成这个过程,给与权重较低的符号较高的优先级(Priority),算法如下:

⒈把n个终端节点加入优先队列,则n个节点都有一个优先权Pi,1 ≤ i ≤ n

⒉如果队列内的节点数>1,则:

⒊最后在优先队列里的点为树的根节点(root)

而此算法的时间复杂度(Time Complexity)为O( n log n );因为有n个终端节点,所以树总共有2n-1个节点,使用优先队列每个循环须O(log n )。

此外,有一个更快的方式使时间复杂度降至线性时间(Linear Time)O( n ),就是使用两个队列(Queue)创件霍夫曼树。第一个队列用来存储n个符号(即n个终端节点)的权重,第二个队列用来存储两两权重的合(即非终端节点)。此法可保证第二个队列的前端(Front)权重永远都是最小值,且方法如下:

⒈把n个终端节点加入第一个队列(依照权重大小排列,最小在前端)

⒉如果队列内的节点数>1,则:

⒊最后在第一个队列的节点为根节点

虽然使用此方法比使用优先队列的时间复杂度还低,但是注意此法的第1项,节点必须依照权重大小加入队列中,如果节点加入顺序不按大小,则需要经过排序,则至少花了O( n log n )的时间复杂度计算。

但是在不同的状况考量下,时间复杂度并非是最重要的,如果我们今天考虑英文字母的出现频率,变量n就是英文字母的26个字母,则使用哪一种算法时间复杂度都不会影响很大,因为n不是一笔庞大的数字。

数据解压缩

简单来说,霍夫曼码树的解压缩就是将得到的前置码(Prefix Huffman code)转换回符号,通常借由树的追踪(Traversal),将接收到的比特串(Bits stream)一步一步还原。但是要追踪树之前,必须要先重建霍夫曼树 ;某些情况下,如果每个符号的权重可以被事先预测,那么霍夫曼树就可以预先重建,并且存储并重复使用,否则,发送端必须预先发送霍夫曼树的相关信息给接收端。

最简单的方式,就是预先统计各符号的权重并加入至压缩之比特串,但是此法的运算量花费相当大,并不适合实际的应用。若是使用Canonical encoding,则可精准得知树重建的数据量只占 B 2^ B 比特(其中B为每个符号的比特数(bits))。如果简单将接收到的比特串一个比特一个比特的重建,例如:"0"表示父节点,"1"表示终端节点,若每次读取到1时,下8个比特则会被解读是终端节点(假设数据为8-bit字母),则霍夫曼树则可被重建,以此方法,数据量的大小可能为2~320字节不等。虽然还有很多方法可以重建霍夫曼树,但因为压缩的数据串包含"traling bits",所以还原时一定要考虑何时停止,不要还原到错误的值,如在数据压缩时时加上每笔数据的长度等。

数据长度

设符号集合 S = { s 1 , s 2 , ⋯ ⋯ --> , s n } {\displaystyle S=\left\{s_{1},s_{2},\cdots ,s_{n}\right\}} , P ( s j ) {\displaystyle P\left(s_{j}\right)} 为 s j {\displaystyle s_{j}} 发生的概率 , L ( s j ) {\displaystyle L\left(s_{j}\right)} 为 s j {\displaystyle s_{j}} 编码的长度

熵(Entropy)

霍夫曼码平均长度

霍夫曼码的长度

霍夫曼码的平均编码长度: 设 b = m e a n ( L ) N {\displaystyle b=mean\left(L\right)N} , N {\displaystyle N} 为数据长度

示范程序

//以下為C++程式碼,在GCC下編譯通過//僅用於示範如何根據權值建構霍夫曼樹,//沒有經過性能上的優化及加上完善的異常處理。#include#include#include#includeusingnamespacestd;constintsize=10;structnode//霍夫曼樹節點結構{unsignedkey;//保存權值node*lchild;//左孩子指針node*rchild;//右孩子指針};dequeforest;dequecode;//此處也可使用bitsetnode*ptr;intfrequency[size]={0};voidprintCode(dequeptr);//用於輸出霍夫曼編碼boolcompare(node*a,node*b){returna->keykey;}intmain(intargc,char*argv[]){for(inti=0;i>frequency[i];//輸入10個權值ptr=newnode;ptr->key=frequency[i];ptr->lchild=NULL;ptr->rchild=NULL;forest.push_back(ptr);}//形成森林,森林中的每一棵樹都是一個節點//從森林構建霍夫曼樹for(inti=0;ikey=forest[0]->key+forest[1]->key;ptr->lchild=forest[0];ptr->rchild=forest[1];forest.pop_front();forest.pop_front();forest.push_back(ptr);}ptr=forest.front();//ptr是一個指向根的指針system("PAUSE");returnEXIT_SUCCESS;}voidprintCode(dequeptr){//dequefor(inti=0;i<ptr.size();i++){if(ptr[i])cout<<"1";elsecout<<"0";}}


免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。

——— 没有了 ———
编辑:阿族小谱
发表评论
写好了,提交
{{item.label}}
{{commentTotal}}条评论
{{item.userName}}
发布时间:{{item.time}}
{{item.content}}
回复
举报
点击加载更多
打赏作者
“感谢您的打赏,我会更努力的创作”
— 请选择您要打赏的金额 —
{{item.label}}
{{item.label}}
打赏成功!
“感谢您的打赏,我会更努力的创作”
返回

更多文章

更多精彩文章
打赏
私信

推荐阅读

· 编码
扩展定义对于特定的上下文,编码有一些更具体的意义。编码(Encoding)在认知上是解释传入的刺激的一种基本知觉的过程。技术上来说,这是一个复杂的、多阶段的转换过程,从较为客观的感觉输入(例如光、声)到主观上有意义的体验。字符编码(Characterencoding)是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对。文字编码(Textencoding)使用一种标记语言来标记一篇文字的结构和其他特征,以方便计算机进行处理。语义编码(Semanticsencoding),以正式语言乙对正式语言甲进行语义编码,即是使用语言乙表达语言甲所有的词汇(如程序或说明)的一种方法。电子编码(Electronicencoding)是将一个信号转换成为一个代码,这种代码是被优化过的以利于传输或存储。转换工作通常由一个编解码器完成。神经编码...
· E编码
格式E编号的格式为E字后加三位数字,分类细项则是EXXX之后再加上i∕ii∕iii或abcd,新项目到用四位数字:EXXXX。分类所有有E编号的食品添加物又更进一步可根据他们的号码分成几大类。食用色素此类别的添加物主要用来使食物具有多种颜色,某些食用色素也具有香味。例如一般常见的橘子汽水,就是加入食用色素调制而成。E100-109–黄色食用色素E110-119–橙色食用色素E120-129–红色食用色素E130-139–蓝色食用色素和紫色食用色素E140-149–绿色食用色素E150-159–棕色食用色素和黑色食用色素E160-199–其他颜色的食用色素防腐剂防腐剂类的添加物主要用于延长食品保存期限,通常都具有抑制细菌生长的功用,以达到防止食品腐坏的效果。E200-209–山梨酸盐类(E201/E202)E210-219–苯甲酸盐类(E211)E220-229–亚硫酸盐类(E227)E23...
· 熵编码法
编码使用长度不同的比特串对字母进行编码有一定的困难。尤其是,几乎所有几率的熵都是一个有理数。使用整数比特(bit)霍夫曼编码建议了一种将比特进位成整数的算法,但这个算法在特定情况下无法达到最佳结果。为此有人加以改进,提供最佳整数比特数。这个算法使用二叉树来设立一个编码。这个二叉树的终端节点代表被编码的字母,根节点代表使用的比特。除这个对每个要编码的数据产生一个特别的表格的方法外还有使用固定的编码表的方法。比如加入要编码的数据中符号出现的概率匹配一定的规则的话就可以使用特别的变长编码表。这样的编码表具有一定的系数来使得它适应实际的字母出现概率。改进使用整数比特的方法往往无法获得使用熵计算的比特数,因此其压缩并非一定最佳。比如字母列由两个不同的字母组成,其中一个字母的可能性是p(A)=0.75{\displaystyle\mathrm{p}(A)=0{.}75},另一个字母的可能性是p(B)=...
· 编码器
举例媒体以下的软件可以将声音、视频或是文字等数据编码成标准格式:压缩软件可以将数据(如声音、图片或视频)编辑成长度较小的数据(引用编解码器)。音频编解码器可以转换及压缩声音数据。视频压缩可以转换及压缩数字视频数据。加密更多资料:密码学和加密基于数据隐私的需求。又分成可逆与不可逆两种。以做为验证系统登录的密码为例,其存放在数据库时,则常使用不可逆的散列函数进行编码,以防止当存放密码的数据库外泄时,被外人轻易得知密码。可逆的加密编码,则配合解码器与用于解密的密钥,以便将数据还原。文件验证为了验正文件的完整性,常使用CRC32、MD5、SHA1等方式计算验证用的键值。传感器支持EnDat通信协议的旋转编码器传感器的编码器是利用光学或磁性或是机械接点的方式感测位置,并将位置转换为电子信号后输出,作为控制位置时的回授信号。传感器依运动方式可分为旋转编码器或是线性编码器(英语:linearencode...
· 非编码DNA
参考文献Bennett,M.D.andI.J.Leitch.Genomesizeevolutioninplants.(编)T.R.Gregory(ed.).TheEvolutionoftheGenome.SanDiego:Elsevier.2005:89–162.Gregory,T.R.Genomesizeevolutioninanimals.(编)T.R.Gregory(ed.).TheEvolutionoftheGenome.SanDiego:Elsevier.2005.

关于我们

关注族谱网 微信公众号,每日及时查看相关推荐,订阅互动等。

APP下载

下载族谱APP 微信公众号,每日及时查看
扫一扫添加客服微信