【数据结构】哈夫曼树的定义 |哈夫曼树的特点 |哈夫曼树的构造 |哈夫曼编码

📖专栏文章:数据结构学习笔记
🪪作者主页:格乐斯

前言

  • 哈夫曼树的定义、特点、构造
  • 哈夫曼编码

哈夫曼树定义

假设有n个权值w1—wn,构造有n个叶子的二叉树,每个叶子的权值是这n个权值之一;这样的二叉树有很多种,其中必有一个或多个的带权路径长度WPL是最小的,这种二叉树称为最优二叉树或哈夫曼树

以下二叉树的权值路径长度:WPL=7x3+6x3+4x3+1x3=36

并非最小WPL,那么怎样构造最小WPL的二叉树,别急接着往下看!

在这里插入图片描述

哈夫曼树的特点

特点

  • 没有度为1的结点

  • n个叶子结点的哈夫曼树共有2n-1个结点

  • 任意非叶子结点的左右子树交换之后仍然是哈夫曼树(只要不改变叶子结点的位置即可)

哈夫曼树的构造

构造哈夫曼树的步骤

  1. 将w1-wn看作带有n棵树的森林,且每棵树仅有一个结点
    在这里插入图片描述

  2. 在森林中选出两个根结点权值最小的树合并,作为新树的左或右子树,且新树的根结点权值为左右子树根结点的权值之和

  3. 删掉合并前的两棵树,添加新合成的树

  4. 重复上述两个步骤,直到只剩一棵树为止,此树即为哈夫曼树

举例说明

  • 如下图有一个含四棵树的森林:

在这里插入图片描述

  • 先选取权值最小的两个树 1和2,并合并结点权值相加,删除合并前的两棵树,添加合并后的树

在这里插入图片描述

  • 合并根结点权值为3和3的两个树,得到根结点权值6的树:

在这里插入图片描述

  • 合成根结点权值为6和5的两个树,得到根结点权值11的树:

在这里插入图片描述

在这里插入图片描述

哈夫曼编码

哈夫曼编码的意义

在远程通讯中,为了使由二进制表示的字符串报文在网络中传播更快,可以采用哈夫曼编码尽可能缩短字符串编码的长度

哈夫曼编码又是前缀无关编码,可以保证在长度不等的编码中,任一字符的编码都不是另一个字符编码的前缀

比如以下的编码方式中,0000能编译出三种字符串,这是绝对不允许的!而哈夫曼编码可以避免这种情况,如何避免的?还请看哈夫曼的编码方式~

在这里插入图片描述

在这里插入图片描述

编码步骤

  1. 统计每个字符在文件中出现的平均概率
  2. 将每个字符的概率作为权值,以权值越大的叶子离根越近,路径也越短的特点,构造哈夫曼树
  3. 在哈夫曼树的每个分支标记:结点左分支为0,右分支为1;再将每个路径上的标记连起来,作为该叶子代表的字符编码

举例说明

  • 现有A、B、C、D四种字符,其出现频率为{5,2,1,3}

在这里插入图片描述

  • 对其进行哈夫曼编码可得:

在这里插入图片描述

总结

本文主要介绍了哈夫曼树的定义、特点以及构造;哈夫曼编码


文章到这结束啦,感谢阅读~

如果文章的论述或代码等出现错误,欢迎前来指正!

如果你觉得文章写的还不错,记得点赞收藏评论三连~ ❤

img

相关推荐

  1. 根据编码

    2024-05-25 18:20:37       36 阅读
  2. de

    2024-05-25 18:20:37       47 阅读
  3. 学习

    2024-05-25 18:20:37       34 阅读
  4. 详解

    2024-05-25 18:20:37       29 阅读
  5. 数据结构及其编码

    2024-05-25 18:20:37       27 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-25 18:20:37       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-25 18:20:37       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-25 18:20:37       82 阅读
  4. Python语言-面向对象

    2024-05-25 18:20:37       91 阅读

热门阅读

  1. Gin框架HTML文件的加载与渲染

    2024-05-25 18:20:37       33 阅读
  2. 520表白html5爱心代码

    2024-05-25 18:20:37       32 阅读
  3. 常见端口号

    2024-05-25 18:20:37       26 阅读
  4. 使用.net core 调用C#WebService的三种方式

    2024-05-25 18:20:37       34 阅读
  5. kafka之consumer参数auto.offset.reset

    2024-05-25 18:20:37       35 阅读
  6. SpringBoot

    2024-05-25 18:20:37       31 阅读
  7. 分账系统说明

    2024-05-25 18:20:37       32 阅读
  8. 探索电子邮件的神奇世界

    2024-05-25 18:20:37       25 阅读
  9. 赶紧收藏!2024 年最常见 20道 Redis面试题(六)

    2024-05-25 18:20:37       37 阅读
  10. Spring的依赖注入

    2024-05-25 18:20:37       33 阅读