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

news2024/11/13 11:48:07

适应性哈夫曼编码

  • 适应性哈夫曼编码
    • 简介
    • 算法
    • 示例

适应性哈夫曼编码

简介

适应性哈夫曼编码(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树完全相同的状态,保证了解码的正确性。

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

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

相关文章

深度学习Day07

Recurrent Neural Network 智慧客服——Slot Filling 根据上 下文产生不同的output

Java搭建宝塔部署实战毕设项目WMS仓库管理系统源码

大家好啊,我是测评君,欢迎来到web测评。 本期给大家带来一套Java开发的毕业设计项目WMS仓库管理系统源码。 技术架构 技术框架:SpringMVC Mybatis Ehcache bootstrap jquery mysql5.7运行环境:jdk8 nginx1.20 tomcat9 In…

基于PSO粒子群算法的MPPT最大功率跟踪Simulink仿真,PSO采用S函数实现

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 MPPT控制器的全称是“最大功率点跟踪”(Maximum Power Point Tracking)太阳能控制器,是传统太阳能充放电控制器的升级换代产品。MPPT控制器能够实时侦测太阳能…

30岁自学Python转行靠谱吗?

前言 30岁自学Python转行靠谱吗?若啃学习任何时候都不晚,关键是学习完用来做什么。提高工作效率,写些脚本实现自动化办公这些完全没问题。如果学python是为了转开发,建议慎重考虑,程序开发转Python相对容易些&#xf…

[附源码]计算机毕业设计血库管理系统Springboot程序

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

计算机网络——运输层【重点】

运输层概述 概念 进程之间的通信 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时&…

【SpingBoot拦截器】实现两个接口,配置拦截路径

文章目录SpingBoot拦截器拦截器与过滤器的区别:1.HandlerInterceptor接口2.WebMvcConfigurer接口3.示例:SpingBoot拦截器 【SpringWeb框架中的拦截器作用类似于过滤器,都可以对一个请求进行拦截处理。】 我们可以用拦截器做很多事情&#xf…

使用HTML制作静态网站作业——我的校园运动会(HTML+CSS)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

Java项目:SSM企业门户网站

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为前后台,前台主要用于官网展示,后台主要为管理员管理, 管理员角色包含以下功能: 管理员…

Rook Ceph浅谈

storageclass是最省心的,上面三种删除了容器存储还在 下图是管理员定义pv,用户不知道这些细节 PersistentVolume pv会跟后端的存储rbd对接 用户通过PVC调用PV ,根据10G容量去pv里找相匹配的自动关联 上图就叫 pvc-demo StorageClass 更厉害 管理员…

PostgreSQL 内核可观测性体系

文章目录背景Metricspgstat指标展示指标统计相关的guc 参数pgstat 实现pg_stat_statements基本用法及指标内容pg_stat_statements 实现Trace总结背景 PG 作为一个演讲30多年历史的TP 数据库,其复杂度极高,如果帮助DBA 在线上分析复杂查询的问题或者构建…

Nexus私服(二)

(一) SpringBoot配置Maven发布至Nexus私服 Nexus默认会带有四常用个仓库,maven-central、maven-public、maven-releases、maven-snapshotsmaven-central类型是proxy代理类型,地址是指向maven中央仓库地址https://repo1.maven.org/maven2/maven-releases、…

空间复杂度(Space Complexity)

预计阅读时间:10分钟 一、简介 随着计算机空间的发展,空间复杂度逐渐变得不那么重要了,但它在比赛中仍然存在。 推导方法: 用常数1取代运行时间中的所有加法常数。 在修改后的运行次数函数中,只保留最高阶项。…

[附源码]Python计算机毕业设计Django旅游网的设计与实现

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

2013-2020年全国31省数字经济信息化基础数据

2013-2020年全国31省数字经济信息化基础 1、时间:2013-2020年 2、来源:国家统计J和统计NJ 3、范围:31省 4、指标包括: "光缆线路长度(公里)、移动电话基站(万个)、信息传输、软件和信息技术服务业…

基于模糊BP神经网络轨迹跟踪(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

【VUE Cli脚手架软件安装篇】

目录 1. 搭建开发环境 1.1. 安装Node.js 1.2. 配置npm源 2. 安装VUE Cli 3. 创建第1个VUE CLI工程 3.1. 创建工程 3.2. 启动服务 3.3. 停止服务 3.4. 重启服务 1. 搭建开发环境 1.1. 安装Node.js 首先需要下载Node.js安装包,下载地址可参考:ht…

【数据结构】顺序表的概念及实现

顺序表1、顺序表概念2、初始化顺序表3、销毁顺序表4、判断顺序表是否为空5、打印顺序表6、检查顺序表的容量(同时充当扩容任务)7、顺序表的尾插8、顺序表的头插9、顺序表的尾删10、顺序表的头删11、查找顺序表中某个数的位置12、在顺序表pos位置插入数字…

光环:元宇宙概念及生态发展现状与研判——张子良

摘要:文章内容主要来源于光环国际2022年第三届中国科创者大会张子良老师的分享,原分享名称为"元宇宙行业应用实践探索"。讲述了元宇宙的理论知识、元宇宙生态圈及当前发展的情况。提出来看一个概念是否相同可以从引入时间、内容两个方面去界定…

【用python的标准库画出显示实时时间的数码管】

🤵‍♂️ 个人主页老虎也淘气 个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏…