哈夫曼编码(Huffman Coding)原理详解

article/2025/9/24 18:06:54

哈夫曼编码

哈夫曼编码,又称为哈夫曼编码(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 序列组合

在这里插入图片描述

因此各个字母的编码分别为:

ABCD
111000101

在没有经过哈夫曼编码之前,字符串“BCAADDDCCACACAC”的二进制为:

10000100100001101000001010000010100010001000100010001000100001101000011010000010100001101000001010000110100000101000011

也就是占了 120 比特;

编码之后为:

1000111110110110100110110110

占了 28 比特。

5. 确定发送的数据

哈夫曼编码将发送字符串的数据长度极大压缩,考虑到接收方的编码,还需要把哈夫曼树的结构也传递过去。

字符占用的 32 比特和 频率占用的 15 比特也需要传递过去。

总体上,编码后比特数为32 + 15 + 28 = 75,比 120 比特少了 45 个,效率还是非常高的。

在这里插入图片描述

从本质上讲,哈夫曼编码是将最宝贵的资源(最短的编码)给出现概率最多的数据。

在上面的例子中,C 出现的频率最高,它的编码为 0,就省下了不少空间。

特点

哈夫曼树和编码都不唯一!只有树的WPL(带权路径长度)才是唯一的!

Huffman编码效果的唯一性
判断是否为哈夫曼编码(编程题)

哈夫曼编码有两个特点:

  1. 带权路径长度WPL最短且唯一
  2. 编码互不为前缀(一个编码不是另一个编码的开头)。
  • 为什么通过哈夫曼编码后得到的二进制码不会有前缀的问题呢?

这是因为在哈夫曼树中,每个字母对应的节点都是叶子节点,而他们对应的二进制码是由根节点到各自节点的路径所决定的,正因为是叶子节点,每个节点的路径不可能和其他节点有前缀的关系。

  • 为什么通过哈夫曼编码获得的二进制码短呢?

因为哈夫曼树是带权路径长度最短的树,权值较大的节点离根节点较近。而带权路径长度是指:树中所有的叶子节点的权值乘上其到根节点的路径长度,这与最终的哈夫曼编码总长度成正比关系的。

参考资料:
图解霍夫曼编码
哈夫曼编码(Huffman Coding)多图详细解析


http://chatgpt.dhexx.cn/article/8ILFnR2w.shtml

相关文章

霍夫曼编码详解

本专栏包含信息论与编码的核心知识,按知识点组织,可作为教学或学习的参考。markdown版本已归档至【Github仓库:information-theory】,需要的朋友们自取。或者公众号【AIShareLab】回复 信息论 也可获取。 文章目录 霍夫曼编码最佳…

霍夫曼编码(Huffman Coding)

霍夫曼编码(Huffman Coding)是一种编码方法,霍夫曼编码是可变字长编码(VLC)的一种。 霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的,出现机率高的字母使用较短的编码,反之出现机率低的则使用…

Typecho 博客美化

以前用typecho博客,现在学生服务器到期了,先记录到csdn上,以后工作有钱了,再租个服务器写博客:) 代码高亮 https://www.typechodev.com/plugin/482.html 天气功能 使用心知天气带的插件就可以轻松实现了。 https://www.seniverse…

Hexo博客之博客美化

https://lqgjava.github.io/2019/08/24/Hexo博客之博客美化/ 只需阅读这一篇文章,就可以让你的博客变得丰富多彩,有添加卡通人物,添加鼠标点击爱心,添加鼠标指针样式 添加彩色滚动变换、添加背景音乐、添加动态彩带等&#xff0…

CSDN博客美化

排列博客分类 管理博客-分类专栏下修改 双击分类名称,即可编辑,输入“#”“空格”“分类名称”可将一级分类改成二级分类。 显示的效果 分类图标设置 编辑-设置图标,可以这里找阿里素材库 效果图

【CSDN】CSDN博客美化教程

一、效果 二、MarkDown简明教程 MarkDown简明教程 三、摘要 添加摘要,增加可读性。 PS. 其实,可以根据深度学习算法,自动生成摘要。 四、自定义博客栏目 五、修改皮肤

博客美化作业详细教程

博客美化作业 第一步 下载作业资源 第二步 在文件夹内打开下载资源 单击后缀为HTML文件的网页文件,右击用编译器打开 这些软件都可以(除了紫色的) 第三步 准备工作 首先让我们重新看下作业要求: 必须使用“类选择器”来美化网…

【全网最全的博客美化系列教程】04.访客量统计的实现

全网最全的博客美化系列教程相关文章目录 【全网最全的博客美化系列教程】01.添加Github项目链接 【全网最全的博客美化系列教程】02.添加QQ交谈链接 【全网最全的博客美化系列教程】03.给博客添加一只萌萌哒的小仓鼠 【全网最全的博客美化系列教程】04.访客量统计的实现 【全网…

Hexo博客美化之——IP签名图一网打尽

love421个人博客地址:https://www.makedreamsir.xyz IP签名图可以实时显示来访者的坐标,IP地址,操作系统,浏览器等等。 使用方法:将下面生成的链接插入到合适的位置即可。 项目原地址:点我打开 原作者博…

Web前端:博客美化:一、模板美化

1、选用模板simplememory 2、写css放在 这些会覆盖掉原来的css样式 我是在网上找的css代码二次加工的 : ) /*1、针对simplememory的修改*/ #google_ad_c1, #google_ad_c2 {display:none;} .syntaxhighlighter a, .syntaxhighlighter div, .syntaxhighlighter code, …

Hexo博客之主题美化

据说 NexT 是使用最多的Hexo主题,原因当然是比较漂亮啦!这个项目托管于github上,你可以fork一下,贡献代码。NexT官网上面给出了详细的主题配置过程,这里只是我的博客使用的一些配置以及NexT网站上配置中需要补充的部分。如果你是从头开始配置,请参考NexT官网。这篇文章介…

csdn写博客美化代码显示

本人写博客只是随笔记录,并不是很正规,见谅。 最近在写博客的时候发现自己贴的代码块就只显示代码,而一些前辈的代码块是这样的: 上图只看格式,代码无实际意义。 下面是我的代码块: 我写的代码块就…

【学习之博客美化】matery主题

为了方便我们这里使用 "Visual Studio Code"打开文件 将博客改为中文 目录:E:\IsQiyaBlog 将 " _config.yml " 文件中代码段 language: en 改为 language: zh-CN 修改主题菜单栏 将它们填上内容 新建分类 categories 页: hexo …

Hexo博客美化之蝴蝶(butterfly)主题魔改

这里写自定义目录标题 首先下载主题配置博客主题_config.yaml配置前须知_config.yaml配置简单介绍 如果参考我的脚手架,大家可以阅读readme和changelog文件,和蝴蝶主题官方文档。 tip: 由于butterfly主题升级至3.0.1,所提供的源码不在进行维护…

Vuepress博客美化技巧

文章目录 导航栏透明背景图填充跳转样式悬浮气泡背景图填充导航栏透明图片中的点击向下跳转的样式悬浮气泡 导航栏透明背景图填充跳转样式悬浮气泡 背景图填充 效果图: 下面的小框扩展到大框,让后面的导航栏透明更完善一些。 编辑Theme/components/Ho…

个人博客美化界面

先看一下我的界面 进入个人博客———管理——设置 在CSS代码框中输入一段代码,如下: /*simplememory*/ #google_ad_c1, #google_ad_c2 {display:none;} .syntaxhighlighter a, .syntaxhighlighter div, .syntaxhighlighter code, .syntaxhighlighter t…

Wordpress(Argon)主题博客美化

前言 常言道:工欲善其事必先利其器,在发表文章前,美化博客,使其利于自己的观看与管理极其重要,所以我四处搜寻,得到了以下美化代码。 但是,有时候我们走得太远,会忘了为什么出发。…

Hexo博客美化

Hexo博客美化 我们搭建好自己的博客以后,可以在hexo官网的 主题 中选择自己喜欢的博客主题,可以直接在主题中点开预览主题样式或者打开主题项目的 github 地址,将该主题下载到我们自己的博客项目中的 theme 文件夹中,然后在 _con…

个人博客美化

文章目录 Butterfly 主题安装修改博主头像生成文章唯一链接本地搜索SitemapRSS追番插件夜间模式繁星(宇宙)背景添加页脚徽标和计时器关于页面 总体参考: Butterfly 文档:https://butterfly.js.organzhiyu :https://anz…

个人博客美化(总结、分享)

博客美化(经验) |主题:EVA、新世纪福音战士、初号机、二号机 |颜色:基础黑白、紫色、绿色、红色 |取材:P站、贴吧eva |我这里只写我的经验,具体的参考主题作者写的笔记具体 修改主题为中文 ​ 这个其实我解…