三种编码方式(费诺曼编码,霍夫曼编码,哈夫曼树编码)的简单解释和介绍

news2024/11/22 10:36:19

一.

费诺曼(Fano)编码是一种前缀编码,其基本原理是将出现频率较高的符号用短的编码表示,而出现频率较低的符号则用长的编码表示。通过这种方式进行编码,可以达到更好的压缩效果。

费诺曼编码的具体过程如下:

  1. 将要编码的符号按照出现频率从高到低排序;
  2. 将所有符号分成两组,使得每组中包含的符号的出现频率之和相近(或者完全相等);
  3. 对每个组进行递归子编码,为每个符号添加一个0或1表示它属于哪个组;
  4. 合并所有的编码,并加上每个符号所对应的标记。

二.

霍夫曼(Huffman)编码是一种经典的前缀编码技术,通常用于数据压缩领域。它的基本思想是对不同符号的出现频率进行统计,然后根据不同符号出现的概率来构造不同长度的编码,以达到信息的最优压缩。

霍夫曼编码具体的过程如下:

  1. 给定一个要编码的消息,统计其中每个符号的出现频率;
  2. 将这些符号按照出现频率从低到高排序;
  3. 将出现频率最小的两个符号合并成一个新的节点,该节点的权值为两个符号的权值之和;
  4. 在剩下的符号中重新选择出现频率最小的两个相邻节点,并合并成一个新的节点,直到所有节点都被合并成一个根节点;
  5. 对于左子树,或者说选择编码时向左转的子节点,标志位设为0;而对于右子树,或者说选择编码时向右转的子节点,标志位设为1;
  6. 根据上述规则生成每个符号的霍夫曼编码,为了避免编码冲突,保证任意一个编码序列不是另一个编码序列的前缀;
  7. 将原始消息通过使用霍夫曼编码表进行编码并压缩,压缩后的数据通常比原数据短,从而实现有效的数据压缩。

三.

哈夫曼树是一种被压缩数据的编码方法,根据哈夫曼树的定义,当一条边向左分支走时,我们可以将其用二进制0表示;当一条边向右分支走时,我们可以将其用二进制1表示。因此,哈夫曼树的存储可以使用0表示左分支,使用1表示右分支。

哈夫曼树编码的具体过程如下:

  1. 统计字符集中每个字符出现的频率,并将它们作为叶子节点加入到一个森林中;
  2. 选取两个频率最小的节点合并成一个新的节点,该新节点的权值为两个节点的权值之和。此时这两个节点在森林中被移除,同时将新生成的节点插入到森林中;
  3. 重复第二步操作,直到森林中只剩下一个节点,即为哈夫曼树的根节点;
  4. 对于哈夫曼树中的每个叶子节点,定义其编码为从根节点到该叶子节点所经过的路径上所有左转弯所组成的二进制数字(或者所有右转弯组成的数字)。例如:从根节点到叶子节点A依次经过了3个左转弯,则叶子节点A的编码为"000"。

费诺曼编码

 霍夫曼编码

 哈夫曼树编码

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

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

相关文章

书籍《银河帝国11:曙光中的机器人》观后感

这本书其实看完有段时间了,《银河帝国11:曙光中的机器人》是阿西莫夫写的《基地》系列第11本书,整个系列不是完全连贯的,本书是《银河帝国10》的后续。 先让我们来回忆一下前奏和背景吧,未来随着人类科技发展,遨游太空…

d2l学习——第一章Introduction

x.1 key components in ML 就和统计学习方法书中说的一样,机器学习也可以分为几个核心要义,Data, Models, Objective Functions, Optimization Algorithms, 其中: Data: 用来学习的数据Model: 如何转换/translate数据的模型Obje…

Vivado_除法器 IP核 使用详解

本文介绍使用Vivado中除法器Divider Generator(5.1)的使用方法。 参考资料:pg151 文章目录 Divider Generator仿真测试 Divider Generator Channel Settings选项卡 #Common Options: Algorithm Type: 一共有三种类型,…

操作系统 第三章 3.1 错题整理

装入时,相应的地址要修改 若存放的位置从150开始 则所有的地址都加150 加完后的地址是物理地址 不能改变 可变分区:产生的外部碎片需要紧凑 C D 都是执行时才进行地址的变换的 该共享段直接在内存中 不用调入调出 供多个进程共享 II 假设该进程很小 页面…

智能指针(1)

智能指针(1) 概念内存泄漏指针指针概念RAII使用裸指针存在的问题 智能指针使用分类unique(唯一性智能指针)介绍智能指针的仿写代码理解删除器 概念 内存泄漏 内存泄漏:程序中已动态分配的堆内存由于某些原因而未释放…

Vue.js 中的插槽是什么?如何使用插槽?

Vue.js 中的插槽是什么?如何使用插槽? 在 Vue.js 中,插槽是一种组件之间通信的机制,允许父组件向子组件传递内容,并在子组件中进行渲染。本文将介绍 Vue.js 中插槽的概念、优势以及如何使用插槽。 什么是插槽&#xf…

cas 6 单点登录登出管理

cas自带的登出是通过登出地址后面接的service地址进行跳转,但是对于service没有进行验证,这边我们网络渗透测试后说可能被钓鱼需要进行验证所以开始了以下操作。 1找资料 首先到cas官网找,发现项目有自带的是否跳转,跳转地址参数…

辞了外包,上岸字节测试岗我落泪了,400多个日夜没人知道我付出了多少....

前言: 没有绝对的天才,只有持续不断的付出。对于我们每一个平凡人来说,改变命运只能依靠努力幸运,但如果你不够幸运,那就只能拉高努力的占比。 2023年3月,我有幸成为了字节跳动的一名自动化测试工程师&am…

Qt导出pdf格式表格

预期目标如下: 头文件: #include #include #include #include #include #include #include private: QString m_html; 调用: QDateTime dateTime QDateTime::currentDateTime(); //当前日期和时间 QString ExportTime dateTime.t…

python带你获取小破站喜爱UP得所用内容

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用: Python 3.8 Pycharm 2022.3版本 ffmpeg <需要设置环境变量> 软件的使用 合成视频和音频 模块使用: 第三方模块&#xff0c;需要安装 import requests >>> pip install requests 内置模…

认识数据湖加速器(Data Lake Accelerator Goose FileSystem,GooseFS)

认识数据湖加速器Data Lake Accelerator Goose FileSystem&#xff0c;GooseFS 一、产品概述二、产品功能三、产品优势四、快速入门五、使用 GooseFS 预热 Table 中的数据六、使用 GooseFS 进行文件上传和下载操作七、使用 GooseFS 加速文件上传和下载操作八、关闭 GooseFS九、…

UE5 Chaos破碎系统学习2

本文继续从实用性的角度学习Chaos破碎系统&#xff0c;因为破碎的许多操作需要力场&#xff0c;比较麻烦&#xff0c;因此本文打算绕过力场实现一些效果&#xff1a; 1.显示材质效果 制作Chaos破碎效果时&#xff0c;会在编辑器下看不见材质&#xff0c;我们可以选择Geometr…

美创数据安全服务能力再获认可!

美创数据安全服务能力又一次获认可&#xff01; 近日&#xff0c;经全方位能力评估和专家评审&#xff0c;美创获得中国软件评测中心和中国计算机行业协会数据安全专业委员会联合颁发的《数据安全服务能力评定资格证书》&#xff0c;数据安全评估能力符合二级评定资格要求。 为…

生存压力下,Smartbi这套方案为企业降本增效带来新的希望

在如今的经济环境下&#xff0c;许多IT企业都面临着困境。经济的不景气导致市场竞争更加激烈&#xff0c;企业的盈利能力受到了严重的冲击&#xff1b;高昂的成本让企业喘不上气来。为了在这个艰难的时期生存下来&#xff0c;降本增效成为了企业的当务之急。 l实施项目利润低&a…

【C++】是内存管理,但C++ !! 模板初阶

目录 一&#xff0c;回望C语言内存 二&#xff0c; C 内存管理方式 1. 内置类型 2. 自定义类型 3. new & malloc 返回内容区别 4. operator new & operator delete 5. malloc/free和new/delete的区别总结 6. 定位new表达式(placement-new) &#xff08;了…

018+limou+C语言预处理

0.前言 您好&#xff0c;这里是limou3434的一篇博客&#xff0c;感兴趣您可以看看我的其他博文系列。本次我主要给您带来了C语言有关预处理的知识。 1.宏的深度理解与使用 1.1.数值宏常量 #define PI 3.1415926注意define和#之间是可以留有空格的 1.2.字符宏常量 #includ…

是德DSO9254A示波器/KEYSIGHT DSO9254A:2.5 GHz

KEYSIGHT是德DSO9254A示波器&#xff0c;Infiniium 9000 系列 2.5 GHz 示波器提供 4 个模拟通道、10 Mpts 存储器和 20 GSa/s 采样率。 简介 Keysight(原Agilent) Infiniium DSO9254A 配有 15 英寸 XGA 显示屏&#xff0c;而且包装非常轻巧&#xff0c;仅有 9 英寸深、26 磅重…

C++ 编写二维码(有源码)

首先来展示一下成果&#xff1a; 二维码图片好像违规了&#xff0c;直接给链接吧网址链接 如果你扫了这个二维码就会得到一个网址&#xff0c;该网址是我写代码的参考&#xff0c;该网站讲述了如何编写一个二维码&#xff0c;很详细&#xff0c;我没有实现汉字的编码&#xff…

LeetCode ! 42 Trapping Rain Water

参考资料&#xff1a;leetCode评论区大佬, 《程序员代码面试指南》 思路1&#xff1a;使用单调栈 维持一个从栈底到栈顶中的元素——下标&#xff0c;对应到数组是从大到小排序。 遍历数组&#xff0c;如果新值大于栈顶元素&#xff08;下标&#xff09;对应的数组值&#xf…

『Linux』第九讲:Linux多线程详解(六 - 完结)_ 线程池 | 读写锁

「前言」文章是关于Linux多线程方面的知识&#xff0c;上一篇是 Linux多线程详解&#xff08;五&#xff09;&#xff0c;今天这篇是 Linux多线程详解&#xff08;六&#xff09;&#xff0c;也是多线程最后一篇&#xff0c;内容大致是线程池&#xff0c;讲解下面开始&#xff…