哈夫曼编码(Huffman coding)

news2024/11/15 4:05:45

哈夫曼编码

  • 哈夫曼编码
    • 简介
    • 发展历史
    • 思想
    • 示例
    • 不足

哈夫曼编码

简介

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

发展历史

1951年,哈夫曼和他在MIT信息论的同学需要选择是完成学期报告还是期末考试。导师Robert M. Fano给他们的学期报告的题目是,寻找最有效的二进制编码。由于无法证明哪个已有编码是最有效的,哈夫曼放弃对已有编码的研究,转向新的探索,最终发现了基于有序频率二叉树编码的想法,并很快证明了这个方法是最有效的。由于这个算法,学生终于青出于蓝,超过了他那曾经和信息论创立者香农共同研究过类似编码的导师。哈夫曼使用自底向上的方法构建二叉树,避免了次优算法Shannon-Fano编码的最大弊端──自顶向下构建树。

1952年,David A. Huffman在麻省理工攻读博士时发表了《一种构建极小多余编码的方法》(A Method for the Construction of Minimum-Redundancy Codes)一文,它一般就叫做Huffman编码。

Huffman在1952年根据香农(Shannon)在1948年和范若(Fano)在1949年阐述的这种编码思想提出了一种不定长编码的方法,也称霍夫曼(Huffman)编码。霍夫曼编码的基本方法是先对图像数据扫描一遍,计算出各种像素出现的概率,按概率的大小指定不同长度的唯一码字,由此得到一张该图像的霍夫曼码表。编码后的图像数据记录的是每个像素的码字,而码字与实际像素值的对应关系记录在码表中。

赫夫曼编码是可变字长编码(VLC)的一种。 Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长 度最短的码字,有时称之为最佳编码,一般就称Huffman编码。下面引证一个定理,该定理保证了按字符出现概率分配码长,可使平均码长最短。

思想

对于更高频的符号,使用更短的编码。这样在对整个信息进行编码时,就可以进行大幅度压缩。

示例

比如一段英文字符AABABCABAB。其中,A出现了5次,B出现了4次,C出现1次。如果我们使用定长编码来进行信息编码,那么每个符号至少需要2个bit来表示:A(01), B(10), C(11),那么字符的编码长度=52+42+1*2 =20bit。但如果采用哈夫曼编码,对于出现频次更高的A,可以使用更短的编码。这里通过构造哈夫曼树来生成码字:

在这里插入图片描述

于是,A(0),B(10),C(11),整段字符的编码长度=51+42+1*2=15bit。可以看见采用哈夫曼编码后,有效的对信息进行了压缩。

不足

哈夫曼确实可以对数据进行压缩,但是无法逼近香农提出的熵极限。对于上面提出的【A出现了5次,B出现了4次,C出现了1次】这种情况,每种符号出现的概率如下:P(A) = 0.5,P(B) = 0.4,P© = 0.1。按照香农的熵计算公式,整个信息的熵应该是:

在这里插入图片描述

也就是这段字符的压缩极限为,平均每个符号用1.361个bit表示。整段字符一共10个字母,压缩极限为10*1.361=13.61bit≈14bit,而采用哈夫曼编码时,我们只压缩到了15bit。为什么会这样呢?这是因为哈夫曼是采用整数进行符号编码的,不够精准,比如对于上面的B和C,它们出现的概率分别为0.4和0.1,但是对于它们俩,哈夫曼却采用了相同长度的编码。

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

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

相关文章

[附源码]JAVA毕业设计计算机在线学习管理系统-(系统+LW)

[附源码]JAVA毕业设计计算机在线学习管理系统-(系统LW) 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项…

实现自定义Spring Boot Starter

实现自定义Spring Boot Starter一、原理二、实战1 自定义 Spring Boot Starter1.1 添加maven依赖1.2 属性类AuthorProperties1.3 自动配置类AuthorAutoConfiguration1.4 业务逻辑AuthorServer1.5 spring.factories2 测试自定义的 Spring Boot Starter2.1 新建module或者新建工程…

什么软件能识别软件?学会这几个软件就可以了

在日常学习或工作中,我们经常会因为各种各样的原因,导致资料无法记全。比如上课的时候老师讲课速度过快、或者开会时需要整理的资料太多,我们做不到一心二用,边听边记。你们遇到类似情况的时候,都是怎么解决的呢&#…

0x02. Spring Boot 3 之SpringBoot 版本升级最佳实践指南

Spring Boot 3 之SpringBoot低版本升级最佳实践0x01 前言0x02 升级Spring Boot2.1 从Spring Boot 1.5.x 升级到Spring Boot 2.x2.1.1 依赖检查2.1.2 检查自定义配置2.1.3 检查系统需要2.1.4 升级到Spring Boot 2.x2.1.5 配置属性迁移2.2 从Spring Boot 2.7.x 升级到Spring Boot…

概率统计·样本及抽样分布【随机样本、抽样分布】

总体与个体 总体:试验的全部可能的观察值称为总体 个体:总体中每个可能的观察值称为个体 总体期望样本平均期望 总体方差/n样本平均方差 随机样本 X1,X2……Xn相互独立(x1,x2……xn是观察值)&#xff0…

[附源码]计算机毕业设计springboot疫苗及注射管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

STC 51单片机52——自发自收串行通信

#include <reg52.h> unsigned char ch0; /* 初始化函数 */ void uart_init() { TMOD0x20; //T1为方式2 TL10xfd; TH10xfd; //波特率为9600的计数初值 SCON0x50; //串口工作在方式1。允许接收 …

[附源码]Python计算机毕业设计Django基于Java的日用品在线电商平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

五问补盲(一) | 激光雷达补盲,视场多大算大?

作者 | 爱LiDAR的小飞哥 编辑 | 王博“大&#xff01;超大&#xff01;更大&#xff01;” 最近&#xff0c;补盲激光雷达市场热闹非凡&#xff0c;各家在宣传产品的视场角时竭尽全力&#xff0c;毫不吝啬形容词。 回归到实际需求&#xff0c;多大的视场角够用&#xff1f;超大…

西门子触摸屏上电显示初始画面几秒后,自动切换到下一个画面的具体方法

西门子触摸屏上电显示初始画面几秒后,自动切换到下一个画面的具体方法 例如:在启动画面停留10秒后,切换到其他画面。 具体实现方法可参考以下内容: 如下图所示,新建一个项目,在画面中添加2个画面, 如下图所示,在变量中添加一个内部变量tag1,用于控制画面的切换, …

es查询响应结果中获取某些字段的值

有时候使用es查询出的结果包含多个字段&#xff0c;如果数据中仅仅包含几个字段时&#xff0c;我们是很容易挑出自己需要的字段值&#xff0c;但是如果数据中包含几十或者几百甚至更多时&#xff0c;尤其是数据中嵌套好多层时&#xff0c;不容易直接挑取出需要的值&#xff0c;…

【人工智能/算法】搜索求解(Solving Problems by Searching)

文章目录一、求解与搜索二、盲目式搜索1. 深度优先搜索&#xff08;Depth First Search, DFS&#xff09;回溯搜索&#xff08;Backtracking Search&#xff09;2. 广度优先搜索&#xff08;Breadth First Search, BFS&#xff09;一致代价搜索&#xff08;Uniform-cost Search…

你们看过《点燃我,温暖你》没有呀,里面比较火的那个爱心代码,今天小编用Python实现啦,这就是程序员的烂漫吗

前言 包子们&#xff0c;上午好 最近有个剧挺火的 就是那个程序员的剧&#xff0c;叫《点燃我&#xff0c;温暖你》 最近听说很火呀&#xff0c;那作为程序员&#xff0c;Python中的战斗机的小编&#xff0c;能不给大家安排一波&#xff01; 怎么说呢&#xff0c;用这个表白也…

DJ13-1 汇编语言程序设计-1

目录 一、基本概念 1. 机器语言&#xff08;machine language&#xff09; 2. 汇编语言&#xff08;assembly language&#xff09; 3. 汇编语言源程序 4. 汇编&#xff08;assemble&#xff09; 5. 汇编程序&#xff08;assembler&#xff09; 6. 宏汇编程序&#xff0…

[附源码]JAVA毕业设计教材管理(系统+LW)

[附源码]JAVA毕业设计教材管理&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xf…

利用CMOS数字隔离器提高智能计量解决方案的数据完整性和可靠性

介绍 随着消费者从传统的机电电表升级到联网的智能电表&#xff0c;自动读表&#xff08;AMR&#xff09;市场预计在未来几年将以两位数的速度增长。当今先进的智能电表使用最新的集成电路&#xff08;IC&#xff09;技术来准确地测量和报告所消耗的耗电量。虽然智能电表比机电…

【pen200-lab】10.11.1.231

pen200-lab 学习笔记 【pen200-lab】10.11.1.231 &#x1f525;系列专栏&#xff1a;pen200-lab &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月27日&#x1f334; &#x1f36d;作…

Metabase学习教程:系统管理-2

数据共享指南 在组织内部或外部&#xff0c;共享数据或分析的选项是什么&#xff1f;何时应该使用一种方法而不是另一种方法&#xff1f; 你有数据&#xff0c;你想&#xff08;或被要求&#xff09;分享它。这些数据是一个问题还是一个访问多个数据库完整的问题数据资料室&a…

SpringCloud - Sentinel熔断与限流

文章目录一.Sentinel下载安装运行二.Sentinel初始化监控三.流控规则1. 阈值类型1.1 QPS1.2 线程数2. 流控模式2.1 直接2.2 关联2.3 链路3. 流控效果3.1 快速失败3.2 WarmUp预热3.3 排队等待四.降级规则1. RT2. 异常比例3. 异常数五.Sentinel 热点key1. 基本使用2. 参数例外项六…

Spring Data JPA - Web 支持、排序和分页

在前面的教程中&#xff0c;我们已经看到了如何使用 Spring Data 分页 Web 支持。在本教程中&#xff0c;我们将了解如何使用排序支持。 在基于 Web 的应用程序中应用排序主要有两种方法&#xff1a; 按可分页处理程序参数排序 我们在前面的示例中使用过&#xff0c;但没有任…