每日学习一个数据结构-哈夫曼树Huffman Tree

news/2024/9/20 7:46:12 标签: 数据结构, 学习, 霍夫曼树

文章目录

      • 基本概念
      • 构造方法
      • 特点
      • 应用
      • 实例

哈夫曼树(Huffman Tree)是一种特殊的二叉树,用于最小化带权路径长度,通常应用于数据压缩。以下是关于哈夫曼树的详细介绍:

基本概念

  • 带权路径长度(WPL):对于一棵二叉树,带权路径长度是所有叶子结点的权重与其到根结点的路径长度的乘积之和。哈夫曼树的目标是构造一棵带权路径长度最小的二叉树。
  • 叶子结点:二叉树中最底层的结点,没有子结点。
  • 非叶子结点:除了叶子结点之外的所有结点,拥有至少一个子结点。

构造方法

哈夫曼树的构造遵循以下步骤:

  1. 初始状态:给定一组带有权重的叶子结点,构造一个森林,其中每个结点都是一个孤立的树。
  2. 合并:从森林中找出两个具有最小权重的树,并创建一个新的结点作为它们的父结点,新结点的权重等于两个子结点的权重之和。
  3. 更新森林:用新创建的树替换原先的两棵树。
  4. 重复:重复上述步骤,直到所有结点合并成单棵树。

特点

  • 最优性:哈夫曼树构造的编码是前缀编码,即没有任何字符的编码是另一个字符编码的前缀,这样可以保证解码的唯一性。
  • 非唯一性:尽管哈夫曼树构造的编码是最优的,但是哈夫曼树本身并不是唯一的。根据不同的构造顺序可能会得到不同的树形,但它们的带权路径长度相同。
  • 编码规则:在哈夫曼树中,从根结点到叶子结点的路径可以定义为字符的编码,通常约定左分支编码为0,右分支编码为1。
  • 叶子结点度:哈夫曼树中不存在度为1的结点,只有度为0(叶子结点)和度为2(内部结点)的结点。

应用

哈夫曼树的主要应用领域包括数据压缩和传输优化。例如,在文件压缩软件中,使用哈夫曼编码可以有效地减少文件大小,从而节省存储空间或加快文件在网络上的传输速度。

实例

假设有四个字符A、B、C、D,它们的频率分别为5、9、12、13。构造哈夫曼树的过程如下:

  1. 初始森林:{A:5}, {B:9}, {C:12}, {D:13}
  2. 合并A和B,形成新结点AB(5+9=14)
  3. 当前森林:{AB:14}, {C:12}, {D:13}
  4. 合并C和D,形成新结点CD(12+13=25)
  5. 当前森林:{AB:14}, {CD:25}
  6. 合并AB和CD,形成新结点ABCD(14+25=39)

最终得到的哈夫曼树可以用来为每个字符生成一个唯一的编码,例如:

  • A: 00
  • B: 01
  • C: 10
  • D: 11

通过这种方式,可以有效地压缩原始数据。


http://www.niftyadmin.cn/n/5666842.html

相关文章

GPT代码记录

#include <iostream>// 基类模板 template<typename T> class Base { public:void func() {std::cout << "Base function" << std::endl;} };// 特化的子类 template<typename T> class Derived : public Base<T> { public:void…

layui table中的checkbox禁用问题

在项目开发中遇到table框已经选择过的数据不支持二次选择从而要禁用复选框不许选中&#xff0c;但会导致复选框全选时layui的table组件源码中赋值时是根据全部复选框的下标顺序来赋值到数组中返回给你&#xff0c;这样已被禁用复选框的数据也会被push到数组中导致数据错乱&…

nginx和php-fpm连接超时的相关配置以及Nginx中的try_files以及root、alias的使用

一、nginx和php-fpm连接超时的相关配置 线上的PHP服务器架构大都是nginx proxy->nginx web->php-fpm。在服务器运行正常&#xff0c;服务器之间的连接正常&#xff0c;未被防火墙阻止的情况下&#xff0c;对这种架构排查504报错时需要注意以下几个地方的参数。 1是nginx…

C++学习笔记(32)

三十四、双链表 示例&#xff1a; #include <iostream> using namespace std; typedef int ElemType; // 自定义链表的数据元素为整数。 struct LNode // 双链表的结点。 { ElemType data; // 存放结点的数据元素。 struct LNode* prior,*next; // 前驱和后继结点的指针。…

Windows10安装cuda11.3.0+cudnn8.5.0,以及创建conda虚拟环境(pytorch)

1、检查电脑驱动版本为561.09&#xff0c;选择cuda版本&#xff0c;下图可知cuda版本<12.6。 nvidia-smi #查看驱动版本&#xff0c;以及最大可以安装的cuda版本 2、Anaconda3-2024.06-1-Windows-x86_64.exe下载&#xff1a; 官网&#xff1a;https://www.baidu.com/link?…

php的require() 和 require_once() 之间的主要区别

PHP 中的 require() 和 require_once() 语句都用于在执行脚本之前插入一个文件的内容到另一个文件中。然而&#xff0c;它们之间有一个关键的区别&#xff0c;这个区别主要体现在它们如何处理被包含文件的重复包含问题上。 require()&#xff1a; 当使用 require() 语句时&…

C语言 | Leetcode C语言题解之第419题棋盘上的战舰

题目&#xff1a; 题解&#xff1a; int countBattleships(char** board, int boardSize, int* boardColSize){int row boardSize;int col boardColSize[0];int ans 0;for (int i 0; i < row; i) {for (int j 0; j < col; j) {if (board[i][j] X) {if (i > 0 &…

江协科技STM32学习- P14 示例程序(定时器定时中断和定时器外部时钟)

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…