哈夫曼树哈夫曼编码知识点

 目录

前言

哈夫曼树

1.相关背景

2.基本概念

3.什么是哈夫曼树

 3.特点

4.哈夫曼树的构造(哈夫曼算法)

5.带权路径长度计算

哈夫曼编码(哈夫曼树的应用)

1.基本概念

 2.编码方式

 3.编码依据

4.小试牛刀(习题)


前言

        今天我们学习一种新的数据结构----哈夫曼树,,其最大的应用就是哈夫曼编码了,下面我会详细介绍和讲解关于哈夫曼树和哈夫曼编码的相关知识点,废话不多说了,开始今天的学习吧!

哈夫曼树

1.相关背景

        1951年,哈夫曼在麻省理工学院(MIT)攻读博士学位,他和修读信息论课程的同学得选择是完成学期报告还是期末考试。导师罗伯特·法诺(Robert Fano)出的学期报告题目是:查找最有效的二进制编码。由于无法证明哪个已有编码是最有效的,哈夫曼放弃对已有编码的研究,转向新的探索,最终发现了基于有序频率二叉树编码的想法,并很快证明了这个方法是最有效的。哈夫曼使用自底向上的方法构建二叉树,避免了次优算法香农-范诺编码(Shannon–Fano coding)的最大弊端──自顶向下构建树。

1952年,于论文《一种构建极小多余编码的方法》(A Method for the Construction of Minimum-Redundancy Codes)中发表了这个编码方法。

2.基本概念

权(weight)给树的节点赋予具有某种含义的数值,这个值表示这个节点的权重

路径:从树中一个结点到另一个结点之间的分支构成这两个结点间的路径

树的路径长度:从树根到每一个结点的路径长度之和,记作:L

树的带权路径长度:树中所有叶子结点的带权路径长度之和,记作:WPL(Weighted Path Length)

3.什么是哈夫曼树

给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近

哈夫曼树:最优二叉树 

 3.特点

1.满二叉树不一定是哈夫曼树

2.哈夫曼树中权越大的叶子离根越近

3.具有相同带权结点的哈夫曼树不惟一

4.带权路径长度(WPL)最短

4.哈夫曼树的构造(哈夫曼算法)

构造过程如下:

1、给定n个权值为{W1,W2,W3……Wn}的节点,构造n棵只有一个叶子节点的二叉树,从而得到一个二叉树集合F={T1,T2,T3……Tn}

2、在F中选取根结点权值最小和依次最小的两个二叉树作为左右子树,构造为一个新的二叉树,这个二叉树的根节点就是左右子树根节点权值之和

3、在集合F中删除作为左右子树的二叉树,并且把刚刚新建立的二叉树放入到集合F中去

4、重复2、3步骤,当F中只剩下一棵二叉树的时候,这个二叉树就是要建立的哈夫曼树,创建完成。

演示过程如下:

给定当前n个权值的节点,如图所示:

视频演示

 视频相关链接:哈夫曼树和哈夫曼编码_哔哩哔哩_bilibili

创建一个哈夫曼树我们会发现,如果有n个节点的话,那么创建之后的总节点为2n-1个 

5.带权路径长度计算

那么怎么去计算哈夫曼树带权路径长度呢?很简单,比如要计算某一个节点的带权路径长度,只需要把这个节点的权值w,乘上距离根结点的边数s,得到的w*s就是其带权路径长度,然后计算出每一个节点的带权路径长度,加起来即可。图示如下:

 

哈夫曼编码(哈夫曼树的应用)

1.基本概念

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

霍夫曼编码使用一种特别的方法为信号源中的每个符号设定二进制码。出现频率更大的符号将获得更短的比特,出现频率更小的符号将被分配更长的比特,以此来提高数据压缩率,提高传输效率

 2.编码方式

1.先统计出字符集出现的权重(比例)

2.然后通过这些字符集的权重创建一个哈夫曼树,权重大的离跟节点越近

3.最后去对每一个分支进行哈夫曼编码

  • 结点的左分支标0,右分支标1

  • 把从根到每个叶子的路径上的标号连接起来,作为该叶子代表的字符的编码。

图示如下:

 3.编码依据

哈夫曼编码有一个要求,就是一个节点的编码不可以是其他节点编码的前缀,目的是要保证编码的唯一性,给个示例:

        A:00        B:01        C:0000        D:101

如果电文为  AABD

那么其编码应该是:000001101

但是实际上跟电文 CBD(其编码也是000001101)有冲突,原因是,A编码是C编码的前缀

 哈夫曼树可以完美的避开这个问题,哈夫曼树的全部节点都是作叶子节点,所以没有一片树叶是其他树叶的父节点。

4.小试牛刀(习题)

已知字符集{ a, b, c, d, e, f },若各字符出现的次数分别为{ 6, 3, 8, 2, 10, 4 },则对应字符集中各字符的哈夫曼编码可能是:

A. 00, 1011, 01, 1010, 11, 100

B. 00, 100, 110, 000, 0010, 01

C. 10, 1011, 11, 0011, 00, 010

D. 0011, 10, 11, 0010, 01, 000

答案:A

解析:根据节点构造出哈夫曼树,然后把节点标注上去,图示如下,然后按照哈夫曼编码的特点直接去读出来即可。 

 以上就是本期的全部内容了,我们下一期再见!

分享一张壁纸:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧楼宇3D数据可视化大屏交互展示实现了楼宇能源的高效、智能、精细化管控

智慧园区是指将物联网、大数据、人工智能等技术应用于传统建筑和基础设施,以实现对园区的全面监控、管理和服务的一种建筑形态。通过将园区内设备、设施和系统联网,实现数据的传输、共享和响应,提高园区的管理效率和运营效益,为居…

socket can查看详细信息 命令 ip -details -statistics link show can0

ip -details -statistics link show can0 ip -details link show can0 ip -statistics link show can0 也可以像第一行那样结合使用

Synchronized的实现和锁升级

1.JVM是如何处理和识别Synchronized的? 我们从字节码角度分析synchronized的实现: Synchronized(锁对象){}同步代码块底层实现方式是monitorenter和monitorexit指令。 修饰普通同步方法时底层实现方式是执行指令会检查方法是否设置ACC_SYNCHRONIZED&am…

登陆认证权限控制(1)——从session到token认证的变迁 session的问题分析 + CSRF攻击的认识

前言 登陆认证,权限控制是一个系统必不可少的部分,一个开放访问的系统能否在上线后稳定持续运行其实很大程度上取决于登陆认证和权限控制措施是否到位,不然可能系统刚刚上线就会夭折。 本篇博客回溯登陆认证的变迁历史,阐述sess…

如何打造一个网络框架模块对接服务器

一、了解网络框架的基本原理 在开始打造网络框架模块之前,首先需要了解网络框架的基本原理。网络框架是一个软件模块,用于处理网络通信的各种细节,包括数据传输、协议解析、错误处理等。常见的网络框架有HTTP、TCP/IP、WebSocket等。 对啦&…

在Remix中编写你的第一份智能合约

智能合约简单来讲就是:部署在去中心化区块链上的一个合约或者一组指令,当这个合约或者这组指令被部署以后,它就不能被改变了,并会自动执行,每个人都可以看到合约里面的条款。更深层次的理解就是:这些代码会…

微信小程序案例:2-2本地生活

文章目录 一、实现步骤(一)创建项目(二)创建页面(三)准备图片素材(四)编写页面结构1、编写轮播区域页面结构2、编写九宫格区域页面结构 (五)编写页面样式1、编…

Redis-持久化机制

持久化机制介绍 RDBAOFRDB和AOF对比 RDB rdb的话是利用了写时复制技术,他是看时间间隔内key值的变化量,就比如20秒内如果有5个key改变过的话他就会创建一个fork子进程(bgsave),通过这个子进程,将数据快照进…

Golang网络编程:即时通讯系统Instance Messaging System

系统基本架构 版本迭代 项目改造 无人机是client,我们是server,提供注册登入,场景选择等。信道模拟器是server,我们是client,我们向信道模拟器发送数据,等待信道模拟器计算结果,返回给无人机。…

MFC 鼠标悬停提示框

MFC 鼠标悬停提示框 运行效果 在MFC窗口中添加一个控件 工具栏中拖拽List Box到MFC窗口给List Box添加变量 CListBox m_listbox 增加成员变量 CWnd* m_tip_parent_wnd; CToolTipCtrl m_tip;给m_listbox创建提示框 void create_tip_window(CWnd* tip_wnd, CToolTipCtrl* ti…

[nltk_data] Error loading stopwords: <urlopen error [WinError 10054]

报错提示&#xff1a; >>> import nltk >>> nltk.download(stopwords) 按照提示执行后 [nltk_data] Error loading stopwords: <urlopen error [WinError 10054] 找到路径C:\\Users\\EDY\\nltk_data&#xff0c;如果没有nltk_data文件夹&#xff0c;在…

Magica Cloth 使用方法笔记

Magica Cloth 使用方法笔记 官方使用文档链接&#xff1a; インストールガイド – Magica Soft 鱼儿效果案例&#xff1a; https://www.patreon.com/posts/69459293 安装环境&#xff1a; 关于在Unity 2018.4.12版本 下 导入 Magic Cloth 之前&#xff0c;需要提前置入的…

FreeRTOS学习笔记(一)

一、基础知识思维导图 vtaskdelay函数会开启中断&#xff0c;所以在临界区不能用vtaskdelay 二、任务的创建与删除 2.1、任务的动态创建与删除 ........#define START_TASK_PRIO 1 #define START_TASK_STACK_SIZE 128 TaskHandle_t start_task_handler; void …

springboot项目集成kafka,并创建kafka生成消息线程池

效果图: 步骤1:添加依赖 <!-- kafka依赖 --><dependency><groupId>org.apache.kafka</groupId><<

vue-slot插槽

作用&#xff1a;让父组件可以向子组件中任意位置插入html结构&#xff0c;也是组件通信方式的一种&#xff0c;适用于父组件》子组件 分类: 默认插槽、具名插槽、作用域插槽 定义子组件时使用slot组件&#xff0c;在使用子组件是可以决定是否插入具体的html代码 默认插槽 如…

【无公网IP内网穿透】基于NATAPP搭建Web站点

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《.内网穿透》。&#x1f3af;&#x1f3af; &#…

RustDay01——运行在线GitHub Rust环境

1.跟着教程进入GitHub教室 2. 授权确认后进入学习空间 3.点击链接进入在线平台 4.添加本机密钥对到GitHub 5. 安装依赖 我们使用在线的Linux试验平台&#xff0c;就自动帮我们clone好了仓库 我们直接在仓库目录执行 cargo install --force --path . 安装依赖 PS:其实刚开始…

数据结构 | (三) Stack

栈 &#xff1a;一种特殊的线性表&#xff0c;其 只允许在固定的一端进行插入和删除元素操作 。 进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO &#xff08; Last In First Out &#xff09;的原则。 压栈&#xff1a;栈…

在Kubernetes中实现gRPC流量负载均衡

在尝试将gRPC服务部署到Kubernetes集群中时&#xff0c;一些用户&#xff08;包括我&#xff09;面临的挑战之一是实现适当的负载均衡。在深入了解如何平衡gRPC的方式之前&#xff0c;我们首先需要回答一个问题&#xff0c;即为什么需要平衡流量&#xff0c;如果Kubernetes已经…

苹果遭遇安全危机,应用商店曝出不良APP,或影响iPhone的销售

据澎湃新闻报道指苹果的App Store被曝出不良APP位居下载榜前列&#xff0c;这对于向来强调APP严格审核的苹果来说是巨大的打击&#xff0c;更影响向来被认为信息安全遥遥领先的名声&#xff0c;对当下正热销的iPhone15或造成打击。 据了解被曝的软件以“学习XX字母”为命名&…