霍夫曼树和霍夫曼编码原理

article/2025/9/24 15:59:51

  一、哈夫曼树的概念和定义

 

什么是哈夫曼树?

让我们先举一个例子。

判定树:

        在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设计直接影响着程序的执行效率。例如,编制一个程序,将百分制转换成五个等级输出。大家可能认为这个程序很简单,并且很快就可以用下列形式编写出来:
 
[cpp] view plain copy
print ?
  1. if(score<60)  
  2.     cout<<"Bad"<<endl;  
  3. else if(score<70)  
  4.     cout<<"Pass"<<endl  
  5. else if(score<80)  
  6.     cout<<"General"<<endl;  
  7. else if(score<90)  
  8.     cout<<"Good"<<endl;  
  9. else  
  10.     cout<<"Very good!"<<endl;  
	if(score<60)cout<<"Bad"<<endl;else if(score<70)cout<<"Pass"<<endlelse if(score<80)cout<<"General"<<endl;else if(score<90)cout<<"Good"<<endl;elsecout<<"Very good!"<<endl;

 
 
若考虑上述程序所耗费的时间,就会发现该程序的缺陷。在实际中,学生成绩在五个等级上的分布是不均匀的。当学生百分制成绩的录入量很大时,上述判定过程需要反复调用,此时程序的执行效率将成为一个严重问题。
 
但在实际应用中,往往各个分数段的分布并不是均匀的。下面就是在一次考试中某门课程的各分数段的分布情况: 
下面我们就利用哈夫曼树寻找一棵最佳判定树,即总的比较次数最少的判定树。
 
 
第一种构造方式:
 
第二种构造方式:
这两种方式,显然后者的判定过程的效率要比前者高。在也没有别地判定过程比第二种方式的效率更高。
我们称判定过程最优的二叉树为哈夫曼树,又称最优二叉树
 
===================================================================================================
 

 定义哈夫曼树之前先说明几个与哈夫曼树有关的概念:

 

路径: 树中一个结点到另一个结点之间的分支构成这两个结点之间的路径。

 

路径长度:路径上的分枝数目称作路径长度。

 

树的路径长度:从树根到每一个结点的路径长度之和。

 

结点的带权路径长度:在一棵树中,如果其结点上附带有一个权值,通常把该结点的路径长度与该结点上的权值

                                                              之积称为该结点的带权路径长度(weighted path length)

  什么是权值?( From 百度百科 )

     计算机领域中(数据结构)

  权值就是定义的路径上面的值。可以这样理解为节点间的距离。通常指字符对应的二进制编码出现的概率。

  至于霍夫曼树中的权值可以理解为:权值大表明出现概率大!

  一个结点的权值实际上就是这个结点子树在整个树中所占的比例.

  abcd四个叶子结点的权值为7,5,2,4. 这个7,5,2,4是根据实际情况得到的,比如说从一段文本中统计出abcd四个字母出现的次数分别为7,5,2,4. 说a结点的权值为7,意思是说a结点在系统中占有7这个份量.实际上也可以化为百分比来表示,但反而麻烦,实际上是一样的.

 

树的带权路径长度:如果树中每个叶子上都带有一个权值,则把树中所有叶子的带权路径长度之和称为树的带

                                   权路径长度。

 

 

             设某二叉树有n个带权值的叶子结点,则该二叉树的带权路径长度记为:

                                  

公式中,Wk为第k个叶子结点的权值;Lk为该结点的路径长度。

 

示例:

======================================================================================================
一般来说,用n(n>0)个带权值的叶子来构造二叉树,限定二叉树中除了这n个叶子外只能出现度为2的结点。
那么符合这样条件的二叉树往往可构造出许多颗,
其中带权路径长度最小的二叉树就称为哈夫曼树最优二叉树
 
===============================================================================
 

  二、哈夫曼树的构造

 
根据哈弗曼树的定义,一棵二叉树要使其WPL值最小,必须使权值越大的叶子结点越靠近根结点,而权值越小的叶子结点
越远离根结点。
 
哈弗曼依据这一特点提出了一种构造最优二叉树的方法,其基本思想如下:
下面演示了用Huffman算法构造一棵Huffman树的过程:

三、哈夫曼树的在编码中的应用

 

在电文传输中,需要将电文中出现的每个字符进行二进制编码。在设计编码时需要遵守两个原则:
(1)发送方传输的二进制编码,到接收方解码后必须具有唯一性,即解码结果与发送方发送的电文完全一样;
(2)发送的二进制编码尽可能地短。下面我们介绍两种编码的方式。
 
1. 等长编码
            这种编码方式的特点是每个字符的编码长度相同(编码长度就是每个编码所含的二进制位数)。假设字符集只含有4个字符A,B,C,D,用二进制两位表示的编码分别为00,01,10,11。若现在有一段电文为:ABACCDA,则应发送二进制序列:00010010101100,总长度为14位。当接收方接收到这段电文后,将按两位一段进行译码。这种编码的特点是译码简单且具有唯一性,但编码长度并不是最短的。
 
2. 不等长编码
            在传送电文时,为了使其二进制位数尽可能地少,可以将每个字符的编码设计为不等长的,使用频度较高的字符分配一个相对比较短的编码,使用频度较低的字符分配一个比较长的编码。例如,可以为A,B,C,D四个字符分别分配0,00,1,01,并可将上述电文用二进制序列:000011010发送,其长度只有9个二进制位,但随之带来了一个问题,接收方接到这段电文后无法进行译码,因为无法断定前面4个0是4个A,1个B、2个A,还是2个B,即译码不唯一,因此这种编码方法不可使用。
 
因此,为了设计长短不等的编码,以便减少电文的总长,还必须考虑编码的唯一性,即在建立不等长编码时必须使任何一个字符的编码都不是另一个字符的前缀,这宗编码称为前缀编码(prefix  code)
 
 
 
(1)利用字符集中每个字符的使用频率作为权值构造一个哈夫曼树;
(2)从根结点开始,为到每个叶子结点路径上的左分支赋予0,右分支赋予1,并从根到叶子方向形成该叶子结点的编码
 
 
例题:
假设一个文本文件TFile中只包含7个字符{A,B,C,D,E,F,G},这7个字符在文本中出现的次数为{5,24,7,17,34,5,13}
利用哈夫曼树可以为文件TFile构造出符合前缀编码要求的不等长编码
 
具体做法:
 
1. 将TFile中7个字符都作为叶子结点,每个字符出现次数作为该叶子结点的权值
2. 规定哈夫曼树中所有左分支表示字符0,所有右分支表示字符1,将依次从根结点到每个叶子结点所经过的分支的二进制位的序列作为该
     结点对应的字符编码
3. 由于从根结点到任何一个叶子结点都不可能经过其他叶子,这种编码一定是前缀编码,哈夫曼树的带权路径长度正好是文件TFile编码
    的总长度
 
通过哈夫曼树来构造的编码称为哈弗曼编码(huffman code)
 
 
  转载地址:http://blog.csdn.net/shuangde800/article/details/7341289





http://chatgpt.dhexx.cn/article/9UhuaDBw.shtml

相关文章

学习笔记--霍夫曼树与霍夫曼编码解码

先摘一下百科的说法 “哈夫曼编码(Huffman Coding)&#xff0c;又称霍夫曼编码&#xff0c;是一种编码方式&#xff0c;哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法&#xff0c;该方法完全依据字符出现概率来构造异字头的平均长度最短的码字&#x…

霍夫曼编码的matlab实现

霍夫曼编码的原理已经有很优秀的介绍博客了&#xff0c;给出现频率高的灰度级分配更短的码字无非就是利用数学中逆序乘积和最小的原理&#xff0c;具体的原理介绍我就不再赘述了。这里给大家分享一下我个人早先实现的霍夫曼编码matlab程序。废话不多说&#xff0c;直接上代码&a…

霍夫曼树和霍夫曼编码以及霍夫曼编码的应用

文章目录 霍夫曼树介绍1.1霍夫曼树的定义1.2霍夫曼树的几个概念1.3构建霍夫曼树的过程1.4代码实现霍夫曼树 霍夫曼编码介绍什么是霍夫曼编码通信领域的应用 字符串压缩1.构造霍夫曼树2.生成赫夫曼树对应的赫夫曼编码表3.通过生成的赫夫曼编码表&#xff0c;返回一个赫夫曼编码 …

霍夫曼编码判断

霍夫曼编码判断 (算法学习) 霍夫曼编码一定是前缀编码&#xff0c;即&#xff0c;没有任何一个编码是另一个编码的前缀。 此外&#xff0c;还需要明白霍夫曼编码构建的树中只有度为0和2的结点&#xff0c;不存在度为1的结点。这与玩全二叉树是不一样的概念&#xff0c;玩全二…

霍夫曼编码和LZ编码

文章目录 一、霍夫曼编码1.概念及编码步骤2.霍夫曼编码例题分析 二、LZ编码1.概念及编码步骤2.LZ编码例题分析 一、霍夫曼编码 1.概念及编码步骤 霍夫曼编码是定长到变长编码&#xff0c;其概率高的符号映射成较短的二进制序列&#xff0c;概率低的符号映射成较长的二进制序列…

[基础知识] 霍夫曼编码

来源&#xff1a;Reducible内容整理&#xff1a;张志宇该视频详细讲解了霍夫曼编码提出的思路历程。 目录 故事背景思路历程 通信系统示意衡量信息量编码和熵的关系香农-冯诺编码霍夫曼的改进 故事背景 1951 年&#xff0c;麻省理工学院的一名研究生 David Huffman 在 Robert F…

数据结构【二】:霍夫曼编码

霍夫曼编码&#xff08;Huffman Coding&#xff09;是可变长编码&#xff08;VLC&#xff09;的一种。本质上使用变长编码表对源符号进行编码&#xff0c;通过评估源符号出现概率的方法进行分类&#xff0c;将出现几率较高的源字符使用较短的编码&#xff0c;出现几率较低的源字…

霍夫曼树——霍夫曼编码

霍夫曼编码 基本介绍 霍夫曼编码是一种编码方式&#xff0c;属于一种程序算法霍夫曼编码是霍夫曼树在通讯领域的经典应用之一霍夫曼编码广泛用于数据文件的压缩&#xff0c;压缩率通常在20% 到90%&#xff0c;通常数据的重复率越高&#xff0c;那么压缩率就越高霍夫曼编码是可…

【数据结构】图解霍夫曼编码,看了就能懂

今天来给大家普及一下霍夫曼编码&#xff08;Huffman Coding&#xff09;&#xff0c;一种用于无损数据压缩的熵编码算法&#xff0c;由美国计算机科学家大卫霍夫曼在 1952 年提出——这么专业的解释&#xff0c;不用问&#xff0c;来自维基百科了。 说实话&#xff0c;很早之前…

霍夫曼编码原理以及代码实现

霍夫曼编码压缩能够实现对于自然语言文件空间大幅压缩。对于普通的文本文件字符&#xff0c;简单起见&#xff0c;如果字符为ASCII&#xff0c;则文本中的每个字符使用7bit来表示&#xff0c;如果文本中有大量的重复相同序列&#xff0c;使用ASCII编码来保存存储会造成大量的空…

霍夫曼编码(huffman coding) (java实现)

文章目录 一、浅谈赫夫曼编码二、获取赫夫曼编码1.获取字符出现的次数2.创建赫夫曼树3.指定编码 三、代码实现1.指定编码代码2.完整代码 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、浅谈赫夫曼编码 赫夫曼编码(Huffman Coding)&#xff0c…

霍夫曼树:霍夫曼编码(Huffman Tree:Huffman Coding)

一、简介 霍夫曼树常处理符号编写工作。根据整组数据中符号出现的频率高低&#xff0c;决定如何给符号编码。如果符号出现的频率越高&#xff0c;则给符号的码越短&#xff0c;相反符号的号码越长。 相关术语 路径&#xff1a;从书中一个节点到另一个节点之间的分支构成这两个…

霍夫曼编码

霍夫曼在1952年提出了霍夫曼编码&#xff0c;霍夫曼编码是一种无损的统计编码方法&#xff0c;利用信息符号概率分布特性来改编字长进行编码。适用于多元独立信源。霍夫曼编码对于出现概率大的信息符号用字长小的符号表示&#xff0c;对于出现概率小的信息用字长大的符号代替。…

霍夫曼(Huffman)编码算法详解之C语言版

一、Huffman编码 霍夫曼(Huffman)树是一类带权路径长度最短的二叉树树。Huffman树的一个非常重要的应用就是进行Huffman编码以得到0-1码流进行快速传输。 在电报收发等数据通讯中&#xff0c;常需要将传送的文字转换成由二进制字符0、1组成的字符串来传输。为了使收发的速度提…

哈夫曼编码

哈夫曼编码 概念前缀码的二叉树及权值哈夫曼编码的设计思想 实例伪代码 概念 哈夫曼编码是一种字符编码方式&#xff0c;是可变长编码的一种&#xff0c;1952年提出&#xff0c;依据字符在文件中出现的频率来建立一个用0,1串表示各字符&#xff0c;使平均每个字符的码长最短的…

图像处理—霍夫曼编码

图像压缩编码是专门研究图像数据压缩的技术&#xff0c;就是尽量减少表示数据图像所需要的数据量。 本章主要介绍图像压缩编码的基础知识&#xff0c;重点讲解常用的图像压缩编码方法&#xff0c;如霍夫曼编码、香农编码、算术编码、行程编码和预测编码及编码方法的MATLAB实现&…

哈夫曼编码(理解)

基础理解 什么是哈夫曼树&#xff08;Huffman Tree&#xff09; 给定N个带权值的叶子节点&#xff0c;如何构造出一个带权路径最小的二叉树&#xff1f; 在数据结构理论中&#xff0c;哈夫曼树又称为最优树&#xff0c;相关的知识点还有哈弗曼编码等。在正式介绍哈夫曼树之前…

学弟学妹们,学会霍夫曼编码后,再也不用担心网络带宽了!

CSDN 的学弟学妹们&#xff0c;大家好&#xff0c;我是沉默王二。 今天来给大家普及一下霍夫曼编码&#xff08;Huffman Coding&#xff09;&#xff0c;一种用于无损数据压缩的熵编码算法&#xff0c;由美国计算机科学家大卫霍夫曼在 1952 年提出——这么专业的解释&#xff…

哈夫曼编码详解

一&#xff1a;基本介绍 哈夫曼编码也翻译为 赫夫曼编码(Huffman Coding)&#xff0c;又称霍夫曼编码&#xff0c;是一种编码方式, 属于一种程序算法 赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。 赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在20%&#xff5…

赫夫曼编码

一 基本介绍 1 赫夫曼编码也翻译为哈夫曼编码(Huffman Coding)&#xff0c;又称霍夫曼编码&#xff0c;是一种编码方式, 属于一种程序算法。 2 赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。 3 赫夫曼编码广泛地用于数据文件压缩。 其压缩率通常在20%&#xff5e;9…