• 新手必知!----哈夫曼树和哈夫曼编码


    今天我们要一起来探讨一下哈夫曼树和哈夫曼编码

    (第一次写文章,我已经尽力了)

    望大佬可以多多给出建议,我会努力改进

    哈夫曼树的定义和构造

    首先,我们来谈谈哈夫曼树的定义

    看完下述定义食不食觉得很脑抽

    哈夫曼树,也被称为最优二叉树,是一种用于数据压缩的树形结构。在这个树中,每个叶子节点都对应着一个待压缩的字符,而内部节点则是字符出现频率的权值。

    但是!看完以下内容后,你就会觉得上述定义更脑抽了

    一:建立哈夫曼树

    有一天,有一群动物要合作建立一个哈夫曼树来压缩它们的声音(不要问为什么)。每个动物都有一个代表它们声音的频率:猫咪的"喵喵"频率最高,狗狗的"汪汪"次之,小鸟的"叽叽"最低。

    首先,动物们将频率写在小纸条上(不要问!问就是大自然的力量),然后放在桌上,按照频率从低到高排序。这些小纸条就像哈夫曼树的叶子节点。

     
     
    1. int ji = 2; // 叽叽的频率
    2. int wang = 5; // 汪汪的频率
    3. int miao = 10; // 喵喵的频率

    现在,让我们开始构建哈夫曼树吧!首先,选取频率最低的两个动物,也就是小鸟和狗狗。

    1. int xiaoniao = ji; // "叽叽"变量名:ji
    2. int gou = wang; // "汪汪"变量名:wang
    注意事项:构建哈夫曼树时,要始终选择频率最低的两个节点来合并。

    接下来,我们将合并这两个节点,创建一个新的内部节点,频率为它们的和。

    int xiaoniao_gou = xiaoniao + gou; // 合并后的节点

    再把这个合并后的节点加入到频率表中,然后重新排序。

    1. int miao = 10; // 喵喵的频率
    2. int xiaoniao_gou = xiaoniao + gou; // 合并后的节点

    接下来,继续选择频率最低的两个节点,合并,加入表中,重复这个过程,直到只剩下一个节点为止。

    int huffman_tree = miao + xiaoniao_gou; // 最终的哈夫曼树

    至此,我们成功构建了一个哈夫曼树,用来表示动物们的声音频率。

    (这个例子食不食肥肠的智慧,但是足够的简单易懂)

    下一步,我们将学习如何使用哈夫曼编码来压缩声音数据。

    哈夫曼编码

    哈夫曼编码是一种将字符映射到二进制编码的方法,确保频率较高的字符具有较短的编码,频率较低的字符具有较长的编码。这使得我们可以用较少的比特来表示常见字符,从而实现数据压缩。

    二:哈夫曼编码

    现在,动物们有了一个漂亮的哈夫曼树,接下来他们想要为每个动物的声音分配独特的编码。编码规则是,从根节点出发,沿着左分支走表示0,沿着右分支走表示1

    让我们看看如何为小鸟的"叽叽"声分配哈夫曼编码:

    1. int huffman_tree = miao + xiaoniao_gou; // 最终的哈夫曼树
    2. // 为小鸟的声音分配哈夫曼编码
    3. string xiaoniao_code = "00"; // 从根节点出发,沿着左分支走,编码为0,然后再向左走一次
    4. //同样的方式,我们可以为其他动物分配哈夫曼编码,例如猫咪的"喵喵"声。
    1. // 为猫咪的声音分配哈夫曼编码
    2. string miao_code = "1";
    3. // 从根节点出发,沿着右分支走,编码为1

    如下图:

           

    现在,动物们都有了自己的哈夫曼编码,他们可以用这些编码来压缩自己的声音数据了。

    结语

    今天我们一起学习了哈夫曼树的构造过程和哈夫曼编码的原理。记住,哈夫曼树是一种用于数据压缩的最优树形结构,而哈夫曼编码则是将字符映射到二进制编码的方法。希望我能帮助你们更好地理解这两个概念,学到这里我觉得这已经够用了~~

  • 相关阅读:
    Linux阻塞IO(高级字符设备二)
    七天.NET 8操作SQLite入门到实战 - SQLite 简介
    SSM 尚筹网 Vue3 + Vite + Java
    Winform开发中使用下拉列表展示字典数据的几种方式
    [C++] 动态内存-malloc/free和new/delete
    C嘎嘎~~[类 中篇]
    最高效“双11”背后:圆通更不一样了
    CKS 认证备考指南
    x86: perf_events内核初始化
    实验四、零比特插入《计算机网络》
  • 原文地址:https://blog.csdn.net/zyxqwertyuiop/article/details/132645747