Huffman 编码

news2025/6/20 4:02:33

1.Huffman编码

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

2.Huffman树

  树是一种重要的非线性数据结构,它是数据元素(结点)按照分支关系组织起来的结构。若干棵互不相交的树所构成的集合成为森林。

  • 路径路径长度

    路径: 在一棵树中,从一个结点往下可以到达的孩子或者孙子结点之间的通路。

    路径长度: 通路中的分支数目。

    若规定根结点的层号为1,则从根结点到第 L L L 层结点的路径长度为: L − 1 L-1 L1

  • 结点的权带权路径长度

    若为树中结点赋予一个具有某种含义的(非负)数值,则这个数值成为该结点的权

    带权路径长度: 从根结点到该结点之间的路径长度×该结点的权

  • 树的带权路径长度

    树的带权路径长度: 所有叶子结点的带权路径长度之和

Huffman树(最优二叉树):给定n个权值作为n个叶子结点,构造一个二叉树,它的带权路径长度最小。

3.Huffman树的构造

给定n个权值 { w 1 , w 2 , . . . , w n } \{w_1,w_2,...,w_n\} {w1,w2,...,wn}作为二叉树的n个叶子结点,可以通过以下算法构造一棵Huffman树。

算法流程:

    1. { w 1 , w 2 , . . . , w n } \{w_1,w_2,...,w_n\} {w1,w2,...,wn}看成是有n棵树的森林(每棵树仅有一个结点)。
    1. 在森林中选出两个根结点的权值最小的树合并,作为新树的左、右子树,且新树的根结点权值为左、右子树根结点权值之和。
    1. 从森林中删除选取的两棵树,并将新树加入森林。
    1. 重复2) 、3)步,直至森林中只剩一棵树为止,该树即为所求的Huffman树。

举个栗子

例1:假设2014年世界杯期间,从新浪微博中抓取了若干条与足球相关的微博,经统计,“我”、“喜欢”、“观看”、“巴西”、“足球”、“世界杯”这个六个词出现的次数分别为15,8,6,5,3,1。请以这6个词为叶子结点,以相应的词频当权值,构造一棵Huffman树。

在这里插入图片描述

从上图可见:词频越大的词距离根结点越近。

构造过程中,通过合并新增的结点被标记为黄色。由于每两个结点都要进行一次合并,因此,若叶子结点的个数为n,则构造的Huffman树中新增的结点的个数为n-1。

约定:词频大的结点作为左孩子结点,词频小的结点作为右孩子结点。

4.Huffman编码

  在数据通信中,需要将传送的文字转换成二进制的字符串,用0,1码的不同排列来表示字符。

例如:需要传送:“AFTER DATA EAR ARE ART AREA",字符集为”A、E、R、T、F、D“,每个字母出现的次数为8,4,5,3,1,1。 现在要求编码这些字母。

要区别6个字母,最简单的二进制编码方式是等长编码,固定采用3位二进制( 2 3 = 8 > 6 2^3=8\gt6 23=8>6),可以用000、001、010、011、100、101对”A、E、R、T、F、D“编码发送,收到电文后按照三位一分进行译码即可。

编码长度取决于报文中不同字符的的个数。若报文中可能出现26个不同字符,则固定编码长度为5( 2 5 = 32 > 26 2^5=32\gt26 25=32>26),但是传送报文时希望长度越短越好。那么如何解决呢?

频率高的字符使用短码,频率低的字符使用长码

为了获取最短长度的报文,可将每个字符出现的频率作为字符结点的权值赋予在该结点上,显然字符使用频率越小权值就越小,权值越小的叶子就越靠下,这样就保证了此树的的最小带权路径长度,效果上就是报文的最短长度。

求最短报文长度 ===> 求字符集中所有字符作为叶子结点,字符频率作为权值所构建的Huffman树

Word2vec中也用到 Huffman 编码,它把训练语料中的词当成叶子结点,其在语料中出现的次数当作权值,通过构建相应的Huffman树来对每一个词进行Huffman编码。

举个栗子:

下图给出了在例1中的6个词的Huffman编码,其中约定(词频大的)左孩子结点编码为1,(词频较小)右孩子结点编码为0。“我”、“喜欢”、“观看”、“巴西”、“足球”、“世界杯”这个六个词的Huffman编码为:0,111,110,101,1001,1000。

在这里插入图片描述

约定:

  • 将权值大的结点作为左孩子结点,权值小的结点作为右孩子结点
  • 左孩子结点的编码为1,右孩子结点的编码为0

5.总结

  • Huffman树(最优二叉树):给定n个权值作为n个叶子结点,构造一个二叉树,它的带权路径长度最小。
  • 词频越大的词距离根结点越近。
  • Word2vec中也用到 Huffman 编码,它把训练语料中的词当成叶子结点,其在语料中出现的次数当作权值,通过构建相应的Huffman树来对每一个词进行Huffman编码。
  • 将权值大的结点作为左孩子结点(编码为1),权值小的结点作为右孩子结点(编码为0)

本文仅仅作为个人学习记录,不作为商业用途,谢谢理解。

参考:https://www.cnblogs.com/peghoty/p/3857839.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/426355.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

​2023年十大目标检测模型!

“目标检测是计算机视觉中最令人兴奋和具有挑战性的问题之一,深度学习已经成为解决该问题的强大工具。”—Dr. Liang-Chieh Chen目标检测是计算机视觉中的基础任务,它涉及在图像中识别和定位目标。深度学习已经革新了目标检测,使得在图像和视…

【CV大模型SAM(Segment-Anything)】真是太强大了,分割一切的SAM大模型使用方法:可通过不同的提示得到想要的分割目标

目录前言安装运行环境SAM模型的使用方法导入相关库并定义显示函数导入待分割图片使用不同提示方法进行目标分割方法一:使用单个提示点进行目标分割方法二:使用多个提示点进行目标分割方法三:用方框指定一个目标进行分割方式四:将点…

文件操作和IO—javaEE

文章目录1.文件1.1文件系统的结构1.2java中的文件操作(metadata的操作)2.io操作2.1定义2.2io划分2.3java的io流之输入流2.4java的io流之输出流1.文件 文件包含数据本身和文件的头信息(metadata),文件的头信息包括文件…

VSCode的C/C++编译调试环境搭建(亲测有效)

文章目录前言1.安装VSCode和mingw642.配置环境变量3.配置VSCode的运行环境3.1设置CodeRunner3.2设置C/C4.调试环境配置前言 这片博客挺早前就写好了,一直忘记发了,写这篇博客之前自己配的时候也试过很多博客,但无一例外,都各种js…

SpringBoot(4)整合数据源

SpringBoot整合数据源数据层解决方案数据源技术持久化技术数据库技术NoSQL整合Redis整合MongDB整合ES数据层解决方案 MySQL数据库与MyBatisPlus框架,后面又用了Druid数据源的配置,所以现在数据层解决方案可以说是MysqlDruidMyBatisPlus。而三个技术分别…

一文彻底了解派克Parker无铁芯/有铁芯直线电机及其应用

一、什么是直线电机? 直线电机是一种将电能直接转换成直线运动机械能,而不需要任何中间转换机构的传动装置。它可以看成是一台旋转电机按径向剖开,并展成平面而成。 二、直线电机的特点 直线电机类似于一台旋转电机解剖摊开来进行运转。在一…

9、DRF实战总结:过滤(filter)与排序,以及第三方库django-filter的使用(附源码)

在前面的DRF系列教程中,以博客为例介绍了序列化器(Serializer), 并使用基于类的视图APIView和ModelViewSet开发了针对文章资源进行增删查改的完整API接口,并详细对权限、认证(含jwt认证)和分页进行了总结与演示。在本篇文章中将向演示如何在Django REST …

Boost库在windows上的使用

今天要配置一个C环境,被Boost库困扰了一段时间,在这里记录一下解决的方法。 主要是打不开 libboost_iostreams-vc143-mt-gd-x64-1_82.lib这样的问题。 操作的步骤如下: 下载binary包: 链接: https://boostorg.jfrog.io/artifac…

ChatGPT有用到知识图谱吗?它自己是这样回答...

从搜索引擎到个人助手,我们每天都在使用问答系统。问答系统必须能够访问相关的知识并进行推理。通常,知识可以隐式地编码在大型语言模型(LLMs)中,例如ChatGPT、T5 和LaMDA 等大型语言模型,这些模型在未结构…

如何面对人生困境至暗时刻

北方春天伊始刚好想发表下另一种境遇就是当人生面临困境或者至暗怎么样走出来,如果有正面临这样的情况来分享下如何走出阴霾,拥有更多可能性的人生,现在回望过去一年的自己太过牵强失去自我。 对世界的应该思维:为什么我总看不清现…

PHP快速入门10-图像处理,附图像大小调整、旋转、获取颜色等15个常见示例

文章目录前言一、PHP的图像处理1.1 图像处理函数二、 图像处理示例2.1 创建一个空白的图像2.2 从文件创建一个新的图像2.3 从URL创建一个新的图像2.4 调整图像大小2.5 对比度和亮度调整2.6 度数旋转2.7 模糊滤镜2.8 获取图像的颜色信息2.9. 图像合并2.10 图像旋转和裁剪2.11 图…

css补充内容

1.最好给body设置min-width,防止缩小页面时出现空白 2.让图片随着网页缩小而缩小 3.html5语义化元素 4.video与audio video是行内替换元素 默认是第一帧静态画面,需要手动调整画面大小和添加播放条,是否自动播放 大多数浏览器不支持自动播放,除非设置为muted,这是为了用户的…

小巧“抠门”的FTHR-F0140开发板

小巧“抠门”的FTHR-F0140开发板 文章目录小巧“抠门”的FTHR-F0140开发板缘起硬件电路主控芯片供电系统调试器插座LED灯按键CAN接口电路软件资源资源链接缘起 工欲善其事,必先利其器。调试和开发MM32F0140这种小巧的芯片,还是需要小巧的板子去适配&…

本科也可入行的IC模拟版图,需要学习哪些知识?

IC模拟版图是一个入门非常简单,但同时又是一份涉及知识面非常广阔,资深较难的工作。 在众多IC岗位中,模拟版图确实属于容易入门,吸引来很多想要转行IC行业的朋友,但需要掌握的知识点和技巧并不比设计少,属…

Python+Selenium+Unittest 之selenium5--元素定位4-XPath定位1(基本概念)

目录 一、简介 二、节点关系 三、绝对路径与相对路径 一、简介 Xpath定位在selenium中属于常用的定位方式,首先来说下Xpath的一些概念,Xpath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置…

Vision Transformers for Dense Prediction论文笔记

文章目录Vision Transformers for Dense Prediction, ICCV, 2021一、背景介绍二、网络结构三、实验结果1.语义分割实验2.消融实验Vision Transformers for Dense Prediction, ICCV, 2021 一、背景介绍 本篇论文主要提出一种网络…

SpringBoot 集成webSocket

pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …

IT软件行业用契约锁实现“代理-销售-投标-项目-合作”电子签

IT软件行业产品销售渠道多、销售订单体量大&#xff0c;从产品研发、销售到项目实施&#xff0c;伴随着大量的协议、合同、单据需要与员工、客户或者经销商签署。引入电子签章&#xff0c;化解纸质合同签署带来的效率、成本、安全等问题&#xff0c;成为软件行业产品代理、销售…

Vector - CAPL - Panel面板_01

前面有过简单的介绍panel面板的功能&#xff0c;不过终究感觉有点简陋&#xff0c;最近也在搞PyQT5&#xff0c;发现如果对于这块了解不多的情况下&#xff0c;想要做一些东西的话&#xff0c;简直无从下手&#xff0c;因此专门翻阅了之前的文章&#xff0c;查看了下确实缺少了…

ChatGPT自动化提高工作效率: 2分钟快速生成思维导图

一、简要说明 ChatGPT不止是一个聊天机器人&#xff0c;更是一个自然语言处理、文本内容生成模型&#xff0c;它可以理解语言规则&#xff0c;不仅仅是给你输出已有的知识内容&#xff0c;还会给到你一些创意点子&#xff1b;所以我们应该学会如何使用它&#xff0c;让它更好的…