哈夫曼编码(Huffman Coding)原理详解
哈夫曼编码
哈夫曼编码,又称为哈夫曼编码(Huffman Coding)
是一种可变长编码( VLC, variable length coding))方式,比起定长编码的 ASCII 编码来说,哈夫曼编码能节省很多的空间,因为每一个字符出现的频率不是一致的;
是一种用于无损数据压缩的熵编码算法,通常用于压缩重复率比较高的字符数据。
如果我们通过转换成ASCII码对应的二进制数据将字符串 BCAADDDCCACACAC 通过二进制编码进行传输,那么一个字符传输的二进制位数为 8bits,那么总共需要 120 个二进制位;而如果使用哈夫曼编码,该串字符可压缩至 28位。
哈夫曼编码方法
哈夫曼编码首先会使用字符的频率创建一棵树,然后通过这个树的结构为每个字符生成一个特定的编码,出现频率高的字符使用较短的编码,出现频率低的则使用较长的编码,这样就会使编码之后的字符串平均长度降低,从而达到数据无损压缩的目的。
1. 计算字符串中每个字符的频率:
2. 按照字符出现的频率进行排序,组成一个队列 Q
出现频率最低的在前面,出现频率高的在后面。
3. 把这些字符作为叶子节点开始构建一颗哈夫曼树
哈夫曼树又称为最优二叉树,是一种带权路径长度最短的二叉树。
(1)首先创建一个空节点 z,将最小频率的字符分配给 z 的左侧,并将频率排在第二位的分配给 z 的右侧,然后将 z 赋值为两个字符频率的和;然后从队列 Q 中删除 B 和 D,并将它们的和添加到队列中,上图中 * 表示的位置。
(2)紧接着,重新创建一个空的节点 z,并将 4 作为左侧的节点,频率为 5 的 A 作为右侧的节点,4 与 5 的和作为父节点,并把这个和按序加入到队列中,再根据频率从小到大构建树结构(小的在左)。
(3)继续按照之前的思路构建树,直到所有的字符都出现在树的节点中,哈弗曼树构建完成。
节点的带权路径长度为从根节点到该节点的路径长度与节点权值的乘积。
该二叉树的带权路径长度 WPL = 6 * 1 + 5 * 2 + 3 * 3 + 1 * 3 = 28。
4. 对字符进行编码:
哈夫曼树构建完成,下面我们要对各个字母进行编码,编码原则是:对于每个非叶子节点,将 0 分配给连接线的左侧,1 分配给连接线的右侧,最终得到字符的编码就是从根节点开始,到该节点的路径上的 0 1 序列组合。
因此各个字母的编码分别为:
A | B | C | D |
---|---|---|---|
11 | 100 | 0 | 101 |
在没有经过哈夫曼编码之前,字符串“BCAADDDCCACACAC”的二进制为:
10000100100001101000001010000010100010001000100010001000100001101000011010000010100001101000001010000110100000101000011
也就是占了 120 比特;
编码之后为:
1000111110110110100110110110
占了 28 比特。
5. 确定发送的数据
哈夫曼编码将发送字符串的数据长度极大压缩,考虑到接收方的编码,还需要把哈夫曼树的结构也传递过去。
即字符占用的 32 比特和 频率占用的 15 比特也需要传递过去。
总体上,编码后比特数为32 + 15 + 28 = 75,比 120 比特少了 45 个,效率还是非常高的。
从本质上讲,哈夫曼编码是将最宝贵的资源(最短的编码)给出现概率最多的数据。
在上面的例子中,C 出现的频率最高,它的编码为 0,就省下了不少空间。
特点
哈夫曼树和编码都不唯一!只有树的WPL(带权路径长度)才是唯一的!
Huffman编码效果的唯一性
判断是否为哈夫曼编码(编程题)
哈夫曼编码有两个特点:
- 带权路径长度WPL最短且唯一;
- 编码互不为前缀(一个编码不是另一个编码的开头)。
- 为什么通过哈夫曼编码后得到的二进制码不会有前缀的问题呢?
这是因为在哈夫曼树中,每个字母对应的节点都是叶子节点,而他们对应的二进制码是由根节点到各自节点的路径所决定的,正因为是叶子节点,每个节点的路径不可能和其他节点有前缀的关系。
- 为什么通过哈夫曼编码获得的二进制码短呢?
因为哈夫曼树是带权路径长度最短的树,权值较大的节点离根节点较近。而带权路径长度是指:树中所有的叶子节点的权值乘上其到根节点的路径长度,这与最终的哈夫曼编码总长度成正比关系的。
参考资料:
图解霍夫曼编码
哈夫曼编码(Huffman Coding)多图详细解析
哈夫曼编码(Huffman Coding)原理详解相关推荐
- 数据压缩之经典——哈夫曼编码(Huffman)
(笔记图片截图自课程Image and video processing: From Mars to Hollywood with a stop at the hospital的教学视频,使用时请注意 ...
- 数据结构C#版笔记--啥夫曼树(Huffman Tree)与啥夫曼编码(Huffman Encoding)
哈夫曼树Huffman tree 又称最优完全二叉树,切入正题之前,先看几个定义 1.路径 Path 简单点讲,路径就是从一个指定节点走到另一个指定节点所经过的分支,比如下图中的红色分支(A-> ...
- 霍夫曼树:霍夫曼编码(Huffman Tree:Huffman Coding)
一.简介 霍夫曼树常处理符号编写工作.根据整组数据中符号出现的频率高低,决定如何给符号编码.如果符号出现的频率越高,则给符号的码越短,相反符号的号码越长. 相关术语 路径:从书中一个节点到另一个节点之 ...
- 贪心算法 - 哈夫曼编码 Huffman
转载地址 : http://blog.csdn.net/xuefeng0707/article/details/7844834 哈夫曼编码: 一种字符编码方式,常用于数据文件压缩.压缩率通常在2 ...
- 哈夫曼编码及文本文件的压缩解压(c++SourceCode)
哈夫曼编码是一种编码方式,是可变字长编码(VLC)的一种.以哈夫曼树-即最优二叉树,带权路径长度最小的二叉树,经常应用于数据 压缩. 在计算机信息处理中,"哈夫曼编码"是一种一致性 ...
- c语言霍夫曼函数,使用C语言详解霍夫曼树数据结构
1.基本概念 a.路径和路径长度 若在一棵树中存在着一个结点序列 k1,k2,--,kj, 使得 ki是ki+1 的双亲(1<=i 从 k1 到 kj 所经过的分支数称为这两点之间的路径长度,它 ...
- 哈夫曼编码(Huffman)Java实现代码简化版
这个网上发现的Huffuman编码Java实现在组织上相对简化,便于理解文件压缩过程:提取文件统计字符频度-根据字符频度创建huffman树-根据huffman树生成huffman可变字长无前缀编码- ...
- python哈夫曼编码注意_Python 算法(2) 哈夫曼编码 Huffman Encoding
这个问题原始是用来实现一个可变长度的编码问题,但可以总结成这样一个问题,假设我们有很多的叶子节点,每个节点都有一个权值w(可以是任何有意义的数值,比如它出现的概率),我们要用这些叶子节点构造一棵树,那 ...
- 哈夫曼编码(Huffman)Java实现代码
网上找到的一个组Huffman编码Java实现代码,比较经典. 1.主类,压缩和解压 package cn.hm;import java.io.BufferedInputStream; import ...
- 关于Python的编码注释# -*- coding:utf-8 -*- 详解
一.普通解释: ...
最新文章
- 学习笔记第三十一节课
- CAShapeLayer和CAGradientLayer
- python三:if...else
- EOS账户系统(6)权限和Action映射
- 粤港澳大湾区菜篮子-哲商对话·林裕豪:从玉农业谋定标准
- remove是什么意思计算机语言,remove是什么意思?remove是什么意思?
- rtsp协议的视频服务器,RTSP拉流协议视频平台EasyNVR能够接入多少路视频直播流?...
- python logger日志级别_python干货分享:使用logging记录日志信息
- win8学习--------计时器
- 海洋zyapi.php,zyapi.php · 姬晓亮/海洋cms 海洋影视管理系统 - 免费开源PHP - Gitee.com...
- 单片机程序的整体框架设计的一些思路体会
- excel空值排查快捷键
- Python Selenium 疑难杂症解方(二): 定位
- 20本书让你迅速跟别人拉开差距
- LayerPagerDemo - 双层可拖拽式布局界面
- 【0基础入门Pytorch】Pytorch的简介与安装(Windows)
- HAL库教程6:串口数据接收
- tcl/tk 的原生界面
- windows 若依部署
- 移动物联网应用典型案例福建8项目入选,四信携手产业共赢
热门文章
- ArcGISServer 10.2发布地理处理服务:以CAD数据至地理数据库为例(2)发布地理处理服务
- 苏州软件企业如何办理自产软件产品增值税即征即退
- 90后美女学霸传奇人生:出身清华姚班,成斯坦福AI实验室负责人高徒
- ocx注册成功但是页面不显示
- Md5,base64加密
- 【音频】音频文件格式以及相关参数
- 计算机上缺少vsix安装程序,vsix - Vsix安装程序在Visual Studio 2017(15.3)中失败 - 堆栈内存溢出...
- 数据可视化基本套路总结
- 计算机辅助教学:多媒体课件制作教程,多媒体课件制作教案
- HTTP请求过程——Chrome浏览器Network详解