IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 哈夫曼树 & 哈夫曼编码 -> 正文阅读

[数据结构与算法]哈夫曼树 & 哈夫曼编码

哈夫曼树

哈夫曼树的定义:设二叉树具有 n 个带权值的叶节点,那么从根节点到各个叶节点的路径长度与相应叶节点权值的乘积的和,叫作二叉树的带权路径长度 WPL (Weighted Path Length)。具有最小带权路径长度的二叉树称为哈夫曼树 (Huffman Tree),也称为最优二叉树。权值较大的结点离根较近。

构造哈夫曼树的原则(贪心思想):

  • 权值越大的叶节点越靠近根节点
  • 权值越小的叶节点越远离根节点

哈夫曼编码

哈夫曼编码就是规定哈夫曼树中的左分支为 0,右分支为 1,从根节点到每个叶节点所经过的分支对应的 0 和 1 组成的序列便为该节点对应字符的编码。这样的编码称为哈夫曼编码。

哈夫曼编码其实就是哈夫曼树的一个非常重要的应用,是可变字长编码 (VLC) 的一种,目的是为了减少存储体积。

如何减少存储体积呢?举个例子:一篇文档只包含字母 A、B、C、D、E、F,它们的出现次数为:A 30次,B 25次,C 20次,D 10次,E 10次,F 5次

在数据传送时,信息表现为 0 和 1 的二进制比特流形式。如果每个字符都是定长编码,由于总共有 6 中字母,则每个字母最少使用 3 bit 表示,最终对应编码如下:

字符编码
A000
B001
C010
D011
E100
F101

存储空间大小计算:(30 + 25 + 20 + 10 + 10 + 5) * 3 = 300 bit

我们知道,网络数据传输时,传输数据越大,就越消耗网络的带宽。为了提高传输的速度,可以采用变长的编码方式,寻找更优的编码方式。我们其实可以按照字符出现的概率分配码长,实现平均码长最短的编码。也就是说,设计编码可以考虑让出现多的字符编码尽量更短,出现少的字符编码稍微长点没关系,是一种贪心思想。这样就能使得存储空间大小降低,提高传输速度。而哈夫曼编码算法正是用来解决该问题的。

但是,你需要考虑的一个问题是,二进制开始 0,1,01,10,11 这个顺序 ,如果来了 001 这个编码,它到底是 (0,0,1) 还是 (0,01) 呢?所以编码不等长的时候你要考虑到这个编码要有唯一性不能出现歧义。这个怎么搞呢?计算机只知道 01 二进制,而二叉树刚好有左右两个节点,至于一个字符它如果是对应叶子节点,那么就可以直接确定,也就是说这个数值不能映射到二叉树的非叶子节点上。

具体的编码过程是:

  1. 初始化 n 个字符单节点的树,每个字符具有概率,记为权重。
  2. 找到权重最小的两个树,把它们作为新树的左右子树,权重之和作为新树的根节点的权重。
  3. 重复第 2 步直到剩下一棵单独的树。
  4. 左子树的一边标 0,右子树一边标 1,从根节点到叶子节点的路径就是哈夫曼编码。

在这里插入图片描述

对应哈夫曼编码如下表:

字符编码
A00
B01
C10
D110
E1110
F1111

存储空间大小计算:2*30 + 2*25 + 2*20 + 3*10 + 4*10 + 4*5 = 240 bit

哈夫曼(霍夫曼)编码是一种无前缀编码。解码时不会混淆。其主要应用在数据压缩,加密解密等场合。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-16 11:26:43  更:2022-05-16 11:26:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:31:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码