【数据结构】赫夫曼树及其应用

简介: 【数据结构】赫夫曼树及其应用

前言:

最基本的压缩编码方法——赫夫曼(huffman)编码。

在了解赫夫曼编码之前,我们必须了解一下赫夫曼树,赫夫曼编码就是基于赫夫曼树实现的。

相关视频——【C语言描述】《数据结构和算法》_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

相关书籍——《大话数据结构》

我的小站——半生瓜のblog,同步更新哦。


@TOC


1.赫夫曼树的定义与原理

  • 结点的路径长度

    • -从根节点到该结点的路径上的连接数。
  • 数的路径长度

    • -树中每个叶子结点的路径长度之和。
  • 结点带权路径长度

    • -结点的路径长度与结点权值的乘积。
  • 树的带权路径长度(WPL)

    • -是树中所有叶子结点的带权路径长度之和。
  • (数结点间的连线相关的数叫做权,Weight)

其中:带权路径长度(WPL)最小的二叉树叫做赫夫曼树。

带权路径长度(WPL)的值越小,说明构造出来的二叉树性越优。


2.构造赫夫曼树的过程

初识森林

在这里插入图片描述

在森林中选出两棵根节点的权值最小的二叉树,小的放左边,大的放右边。

在这里插入图片描述

合并两颗选出的二叉树,增加一个新结点作为新二叉树的根,权值为左右孩子的权值之和。

在这里插入图片描述

再从剩下的森林里面选出权值最小的二叉树,如果比第一次合并的结点权值小就放左边,反之,放右边。

在这里插入图片描述

再次进行合并。

在这里插入图片描述

第二次合并完成,第三次合并同理。

在这里插入图片描述

合并完成,这个二叉树就是赫夫曼树。

3.赫夫曼编码原理


补充:

赫夫曼研究这种最优树的目的是为了解决当年远距通信(主要是电报)的数据传输的最优化问题。


名词解释:

  • 定长编码

    • -像ASCII编码,用八位二进制数来表示一个字符。
  • 变长编码

    • -单个编码的长度不一致,可以根据整体频率来调节。
  • 前缀码

    • -所谓的前缀码,就是没有任何码字是其他码字的前缀。

编码过程(encode):还是利用上面的赫夫曼二叉树。

上图为构造赫夫曼树的过程权值显示。

下图为将权值左支改为0,右支改为1后的赫夫曼树。

在这里插入图片描述

在这里插入图片描述

我们对这4个字母(ABCD)用其从树根到叶子所经过路径0或1来进行编码。

例如原文字内容是ABCD。

原编码二进制串:000001010011(共12个字符)

新编码二进制串:010110111(共9 个字符)

也就是说我们的数据被压缩了,节约了25%的存储空间或者传输成本,随着字符的增加和字符权重的不同,这种压缩会更加显出其优势。


解码过程(decode):

发送方和接收方必须要约定好同样的赫夫曼编码规则,由约定好的赫夫曼树可以成功解码。

相关文章
|
16天前
|
存储 消息中间件 NoSQL
Redis数据类型详解:选择合适的数据结构优化你的应用
Redis数据类型详解:选择合适的数据结构优化你的应用
|
1月前
|
C语言
数据结构——堆的应用 Topk问题
数据结构——堆的应用 Topk问题
数据结构——堆的应用 Topk问题
|
1月前
|
算法
数据结构——堆的应用 堆排序详解
数据结构——堆的应用 堆排序详解
数据结构——堆的应用 堆排序详解
|
29天前
|
存储 缓存 并行计算
C/C++ 数据结构设计与应用(二):自定义数据结构的设计 (Design of Custom Data Structures)
C/C++ 数据结构设计与应用(二):自定义数据结构的设计 (Design of Custom Data Structures)
51 0
|
2天前
|
算法 DataX
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
|
20天前
|
存储 编译器 C语言
【数据结构】深入浅出理解链表中二级指针的应用
【数据结构】深入浅出理解链表中二级指针的应用
27 0
|
23天前
|
存储 算法 程序员
【数据结构】【版本2.0】【树形深渊】——二叉树入侵
【数据结构】【版本2.0】【树形深渊】——二叉树入侵
|
24天前
|
存储 算法 数据库
【C/C++ 数据结构 】树的 四种表示方法
【C/C++ 数据结构 】树的 四种表示方法
26 0
|
24天前
|
存储 算法 C语言
【C/C++ 数据结构 树】探索C/C++中的二叉树:从理论到实践
【C/C++ 数据结构 树】探索C/C++中的二叉树:从理论到实践
60 0
|
24天前
|
存储 设计模式 算法
【C/C++ 数据结构 线性表】深入理解与实现栈:从基础到应用的全面探索
【C/C++ 数据结构 线性表】深入理解与实现栈:从基础到应用的全面探索
52 0

热门文章

最新文章