适应性哈夫曼编码(Adaptive Huffman coding)

哈夫曼编码(霍夫曼、赫夫曼) 在数字电视大力发展的今天, 阅读详情
AI摘要

适应性哈夫曼编码是一种动态编码技术,可在传输过程中构建代码,并随着数据流的变化更新符号概率。它允许实时编码,但对传输错误更敏感。通过使用NYT节点和动态更新哈夫曼树的方法,实现高效的数据压缩。

适应性哈夫曼编码

简介

适应性哈夫曼编码(Adaptive Huffman coding),又称动态哈夫曼编码(Dynamic Huffman coding),是基于哈夫曼编码的适自适应编码技术。它允许在符号正在传输时构建代码,允许一次编码并适应数据中变化的条件,即随着数据流的到达,动态地收集和更新符号的概率(频率)。一遍扫描的好处是使得源程序可以实时编码,但由于单个丢失会损坏整个代码,因此它对传输错误更加敏感。
在哈夫曼编码中,有个缺点是除了压缩后的资料外,它还得传送机率表给解码端,否则解码端无法正确地做解码的工作。如果想要压缩好一点,必须有更多的统计资料,但同时必须要送出更多的统计资料到解压缩端。而适应性编码可以利用已经读过的资料机动的调整哈夫曼树。适应性哈夫曼编码中,算法FGK的基本原则是根据兄弟性质(Sibling Property),由Gallager定义。一颗哈夫曼树只是一棵在每个节点,包括树叶与内节点,加上加权值得二叉树,除了树根外,每一个节点都有一个兄弟节点与其共有一个父亲节点。如果每一个节点可以按照加权值从小排列到大且每个节点又再自己的兄弟相邻,称为兄弟性质。修改、或更新一棵哈夫曼树包括两个步骤。第一个步骤是频率次数的增加,先找到该叶子,把频率加一,在往上找他的父亲节点,也跟着加一,直到树根皆照着此步骤。第二个步骤是如果增加加权值的动作使得兄弟性质不再满足时,必须做调整的动作,借由交换叶子改变频率增加的顺序,同时,交换位置后的父亲节点加权值也要跟着更新,以此原则使之再度成为哈夫曼树。

算法

参考博客:自适应(动态)哈夫曼编码与解码过程

自定义哈夫曼编码,预先不知道各种符号的出现频率,编码树的初始状态只包含一个叶节点,即NYT(Not Yet Transmitted),NYT是一个逸出码,不同于任何一个将要传送的符号,当一个尚未包含在编码树中的符号需要被编码时,首先输出NYT的编码,然后跟着符号的原始表达。当解码器解出一个NYT之后,它就知道下面的内容暂时不再是Huffman编码,而是一个从未在编码数据流中出现过的原始符号。当插入一个符号q时,会出现两种情况:

  1. q是第一次出现的字符结点。构造一个新的子树,子树包含NYT符号和新符号两个叶节点,如下图所示。然后判断该子树的父节点是否是是当前权重下编号最大的结点,如果是,直接更新权重即可;否则,将父节点与相同权重的编号最高的结点交换,再更新权重值。

在这里插入图片描述

  1. q不是第一次出现的字符结点。如果q所在节点,是当前节点权重下编号最大的结点,则直接使其当前节点权重及父节点权重加1即可。否则,将当前节点与相同权重的编号最高的结点交换,再更新权重值。

示例

以字符串“aabbbacc”的编码和解码为例,假设原始共有四类字符(a,b,c,d),规定初始化编码:a-00,b-01,c-10,d-11,此为编码器与解码器双方的约定。

编码过程:

  1. 初始状态,仅有NYT节点,权重为0。
    在这里插入图片描述

  2. 输入字符a,为新字符,输出编码000。0为NYT编码,00是a的初始编码,此时的huffman树为:
    在这里插入图片描述

  3. 输入字符a,输出编码1。将a加入到huffman树中,并进行调整。
    在这里插入图片描述

  4. 输入字符b,为新字符,输出编码001。0是NYT编码,01是b的初始编码。
    在这里插入图片描述

  5. 输入字符b,输出编码01。将字符b加入到huffman树中,并进行调整。
    在这里插入图片描述

  6. 输入字符b,输出编码01。将字符b加入到huffman树中,注意此时b节点不是当前权重值下编号最大的节点,需要进行节点的交换操作,即节点(2)与节点(4)交换。
    在这里插入图片描述

  7. 输入字符a,输出编码01,将a加入到huffman树中。
    在这里插入图片描述

  8. 输入字符c,为新字符,输入编码0010。00是NYT编码,10是c的初始编码。该子树的父节点(5)不是当前权重下编号最大的节点,所以节点(5)与节点(6)交换,并更新权重值。
    在这里插入图片描述

  9. 输入字符c,输出编码101,将字符c加入到huffman树中。
    在这里插入图片描述

综上所述,字符串“aabbbacc”动态哈夫曼编码的结果为00010010101010010101。

解码过程:

由于自适应Huffman编码算法采用了先编码,后调整编码树的方案,相应的解码算法比较简单。解码算法也使用仅有唯一的NYT节点的编码树作为初始状态,然后根据Huffman编码数据流,对符号进行还原。每次处理完一个符号,就使用这个符号调整编码树。这样,在每一次输入新的符号之前,Huffman树都处于与进行编码时使用的Huffman树完全相同的状态,保证了解码的正确性。

FGK adaptive Huffman encode to compress file ##关于自适应哈夫曼编码,常用的有FGK和Vitter。这里讲的是FGK,先放上一个关于FGK的网页,以便于理解过程。 添加链接描述 稍后更新FGK的讲解和代码。 ... 阅读详情

相关推荐

自适应(动态)哈夫曼编码与解码过程

自适应(动态)哈夫曼编码与解码过程 自定义哈夫曼编码,预先不知道各种符号的出现频率,编码树的初始状态只包含一个叶节点,即NYT(Not Yet Transmitted),NYT是一个逸出码,不同于任何一个将要传送的符号,当一个尚未包含在编码树中的符号需要被编码时,首先输出NYT的编码,然后跟着符号的原始表达。当解码器解出一个NYT之后,它就知道下面的内容暂时不再是Huffman编码,而是一个从未在编码数据流中出现过的原始符号。当插入一个符号q时,会出现两种情况: q是第一次出现的字符结点。构造一个新的子树

weixin_43838265的博客 9850

自适应哈夫曼编解码

自适应哈夫曼编码的数据压缩与解压技术

iqfqfqf的博客 3694

【信息科学与工程学】【通信工程】第十五篇 OTN

交叉类型技术原理交换粒度切换时间端口数损耗(dB)串扰(dB)成熟度主要厂商电交叉(OTN)​O/E/O转换,电层调度子波长(ODU0/1/2/4/flex)ms级数百15-25<-40高华为、中兴、Nokia波长交叉(WSS)​波长选择开关波长级(λ)ms级1×N(9-20)5-8<-30高Finisar、Lumentum光纤交叉(FXC)​光纤机械/热光开关光纤级10-50ms1×N(高达128)1-3<-50高DiCon、Sercalo光突发交换(OBS)​突发交换控制突发级μs级数十5-10<-30

weixin_49199313的博客 1673

《哈夫曼编码》(详细!!!)

给个关注吧

C5408C的博客 2万+

Adaptive-Huffman:自适应霍夫曼编码的Java实现

自适应霍夫曼 使用Vitter算法在Java中实现自适应霍夫曼编码。 如何运行编码器 使用javac进行编译 $ java adaptiveHuffman.encoder.Encoder InputFile OutputFile` 其中InputFile是要压缩的一些文本或其他文件,而OutputFile是将压缩后的代码写入的位置。 如何运行解码器 $ java adaptiveHuffman.decoder.Decoder InputFile OutputFile 其中InputFile是压缩的中间文件,而OutputFile是将未压缩的数据写入的位置。

Adaptive-Huffman-coding:自适应霍夫曼编码(也称为动态霍夫曼编码)是一种基于霍夫曼编码的自适应编码技术。 它允许在传输符号时构建代码,没有源分布的初始知识,允许一次性编码和适应数据中不断变化的条件

自适应霍夫曼编码 自适应霍夫曼编码(也称为动态霍夫曼编码)是一种基于霍夫曼编码的自适应编码技术。 它允许在传输符号时构建代码,没有源分布的初始知识,允许一次性编码和适应数据中不断变化的条件。

深入理解Huffman编码:原理、代码示例与应用

在这个数字时代,数据的有效压缩和传输变得至关重要。Huffman编码是一种经典的数据压缩算法,它通过将常见字符映射到短编码来降低数据大小,从而节省存储空间和带宽。本篇博客将深入介绍Huffman编码的原理、代码示例以及实际应用。

VLOKL的博客 2121

vc mfc listctrl使用虚拟列表 虚拟列表用法

note 虚拟列表可有效加载大量数据 需要处理listctrl的 LVN_GETDISPINFO 消息 使用虚拟列表 不能 使用 insert的方法插入数据,而是告诉listctrl 当前要显示多少行 使用SetItemCount函数告诉listctrl当前显示多少行 使用虚拟列表需要自己维护数据源 使用 添加list ctrl 控件 将其Owner Data 属性 设置为 True 添加...

知其所以然 397

GZIP压缩原理分析(31)——第五章 Deflate算法详解(五22) 动态哈夫曼编码分析(11)构建哈夫曼树(03)

构建distance树

jison_r_wang的专栏 7505

Winform美化框架AntdUI中Table的使用方法

使用核心注意点: 数据模型中属性名需要完全与new Column里的列名一致否则添加数据源则无法读取到详细内容。

wevix的博客 3675

2023年全国职业院校技能大赛“信息安全管理与评估”-真题——赛题题目+答案解析

2023年全国职业院校技能大赛“信息安全管理与评估”-真题——赛题题目+答案解析

君逍遥o 5987

自适应霍夫曼编码

与传统的静态霍夫曼编码相比,自适应霍夫曼编码的优点在于它不需要提前获取整个数据流的统计信息,而是在编码过程中根据实际观察到的数据进行动态调整。然后,从该字符节点开始,向根节点遍历,逐步更新各个节点的权重,并根据权重大小调整节点的位置,以保持编码的前缀性质。自适应霍夫曼编码的核心思想是将频率较高的字符用较短的编码表示,而频率较低的字符用较长的编码表示,从而实现数据的压缩。解码过程与编码过程相反,根据当前的霍夫曼编码树和读取的编码比特流,逐步遍历编码树,直到找到对应的字符或符号。

sun13047140038的博客 975

GPU架构(1.1)--介绍 GPU的 VPU(Vision Processing Unit)架构

基于自研的 VPU(Vision Processing Unit)架构,专为高性能图形处理和深度学习设计。VPU 架构通过优化计算单元、内存层次结构、同步机制和指令流水线,提供了卓越的性能和能效。VPU 架构通过优化计算单元、内存层次结构、同步机制和指令流水线,提供了卓越的性能和能效。这种架构不仅适用于高性能图形处理,还广泛应用于深度学习、科学计算和边缘计算等领域。通过了解 VPU 架构的详细设计和工作原理,读者可以更好地利用这些先进的 GPU 技术,开发出高效、可靠的计算系统。

MHD0815的博客 1298

算法-哈夫曼编码

哈夫曼树是一种基于字符频率的最优二叉树,用于数据压缩。通过统计字符频率,构建优先级队列,并采用贪心策略合并最小频率节点,最终生成前缀编码(高频字符编码短,低频字符编码长)。其优点包括高效压缩、简单实现、无损解码等,广泛应用于文件压缩、多媒体编码等领域。Java代码示例展示了静态和动态哈夫曼编码的实现方法,其中动态版本可适应流式数据频率变化。哈夫曼树还可用于网络路由优化、基因数据分析等其他场景,通过最小化编码长度显著提升存储和传输效率。

纯洁的小魔鬼 1万+

Odoo 入门 | 什么是 Odoo?

Odoo是一套全球开源的ERP/CRM系统,最初的名字为TinyERP,08年5月之后称之为OpenERP,之后又改为Odoo。

洛阳泰山的博客 6207

1、初探 Tiny Machine Learning

Tiny Machine Learning(TinyML)是机器学习与嵌入式系统的融合领域,致力于在资源受限的微控制器上运行AI模型。本文介绍了机器学习基础、TinyML的核心概念、应用领域(如智能家居、工业物联网、医疗保健)、面临的挑战(如资源限制、模型压缩、数据质量),以及从硬件准备到模型部署的实践步骤。通过利用训练与推理的资源不对称性,可在PC上训练模型并部署至低功耗设备进行实时推理,推动边缘智能的发展。

loss4bartender的博客 121

哈夫曼编码(技术科普)

一、哈夫曼编码解释 1.基本介绍         哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,属于程序算法的一种。哈夫曼编码是可变字长编码(VLC)的一种。该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。 2.编码提出者         这种编码方式是Huffm

wenhlin的博客 6885

C# MVVM的“核武器”:CommunityToolkit.Mvvm的RelayCommand实战全解

你默默打开VS:“该用RelayCommand的‘量子纠缠’魔法了!用户点击按钮无响应,调试器显示命令未绑定,但代码看起来完美无缺。“我的MVVM应用?那可是能穿越线程的命令量子计算机!异步操作阻塞了UI线程,用户界面变成“加载中”死循环。:UI与业务逻辑通过命令“量子隧道”解耦。:所有长时间操作自动进入“量子跃迁”模式。:携带任意上下文的“量子信封”传递。:命令可用性随数据变化实时同步。

java专栏 663

自适应哈夫曼编码

网上自适应哈夫曼编码的文章大多来自同一篇,而且在转载的过程中还有一定的错误。花了一天多的时间看懂了自适应哈夫曼编码的原理并且用链式树的结构完成了代码。原理:        自适应哈夫曼树的节点结构体如下:struct Node { int weight; int num; Node* p_left; Node* p_right; Node* p_parent; Node(Node* p...

qq_36533706的博客 1万+

第十二章 供水管网水力模型软件介绍

本文介绍了国内外主要供水管网建模软件及其特点,重点分析了某高建模软件V14的创新功能。国际主流软件包括开源的EPANET、商业软件InfoWorksWS、WaterGEMS和MIKEURBAN,各具特色但存在应用局限。某高V14软件实现了管网GIS与模型一体化管理,采用一G多网、一网多模、一模多案、网模合一技术路线,支持全信息模型建立和动态数据更新。其创新点包括水量分配理念革新(精确/模糊匹配、三种用水模式)和首创Web服务功能。通过并发计算、GPU加速等技术优化性能,具有较高性价比。

weixin_45258875的博客 207

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

GZIP压缩原理分析(30)——第五章 Deflate算法详解(五21) 动态哈夫曼编码分析(10)构建哈夫曼树(02)

*范式哈夫曼编码 使用静态哈夫曼编码的编码/解码双方同时拥有一张完全相同的码表,这张码表是事先规定好的,只要使用这种压缩方式并且使用这种压缩方式对应的静态哈夫曼编码,那么压缩方就照着码表压缩,解码方照着码表直接解压。就好比我们使用莫尔斯码通讯,双方在通讯之前就约定好使用莫尔斯码(什么时候约定的?可能是某次吃饭的时候,或者聊天的时候,或者一起喝酒的时候……),双方都有一张莫尔斯码表,通讯的时候,一

jison_r_wang的专栏 4159

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

GZIP压缩原理分析(33)——第五章 Deflate算法详解(五24) 动态哈夫曼编码分析(13)构建哈夫曼树(05)

构建CCL树

jison_r_wang的专栏 5851

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【数据结构与算法】-哈夫曼树(Huffman Tree)与哈夫曼编码

超详细讲解哈夫曼树(Huffman Tree)以及哈夫曼编码的构造原理、方法,并用代码实现。

闪耀大叔的博客 8万+

Huffman树和Huffman编码

文章目录Huffman树的定义 Huffman树的定义

薛定谔的猫的博客 3667

算法与数据结构 上机----实训操作2 Huffman

利用动态分配数组存储Huffman树,设计一组输入数据(假定为一组整数),能够对其进行如下操作: 创建一个新的顺序表,实现动态空间分配的初始化; 对输入的数据构造成一棵Huffman 树; 根据生成的Huffman 树进行Huffman 编码; 实现对输入数据的Huffman 编码输出; 编写主程序,实现对以上操作的调用。 执行代码: #include<stdlib.h> #include<stdio.h> #include<string.h> //哈夫曼树与编

软件程序媛的博客 1580
上一篇: 哈夫曼编码(Huffman coding)
下一篇: 算术编码(Arithmetic coding)
UestcXiye
博客等级 码龄8年 9027粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值