news 2026/2/25 20:28:23

哈夫曼树译码函数(Decoding) 该函数通过哈夫曼编码串和已构建的哈夫曼树,还原出原始字符序列

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
哈夫曼树译码函数(Decoding) 该函数通过哈夫曼编码串和已构建的哈夫曼树,还原出原始字符序列

一、哈夫曼树译码函数(Decoding)
该函数通过哈夫曼编码串和已构建的哈夫曼树,还原出原始字符序列。其核心逻辑如下:

  1. 初始状态:从哈夫曼树的根节点开始(在数组表示中,根节点下标通常为2*n - 1,其中n是叶子节点数量)。
  2. 遍历编码串
    • 对于编码串中的每一位:
      • 若为'0',则跳转到当前节点的左孩子;
      • 若为'1',则跳转到当前节点的右孩子。
  3. 判断是否到达叶子节点
    • 当前节点的左右孩子均为 0(或为空),说明是叶子节点;
    • 此时输出该节点所代表的字符;
    • 然后重新回到根节点,继续后续译码。
  4. 终止条件:编码串全部位处理完毕,译码结束。

示例代码(C语言风格结构体与数组实现):

#include<stdio.h>#include<string.h>#defineMAX_NODE100typedefstruct{charch;// 存储字符intweight;// 权重intparent,lchild,rchild;// 双亲、左孩子、右孩子下标}HTNode;voidHuffmanDecode(HTNode ht[],introot,char*code,intn){inti=0;intcurrent=root;intlen=strlen(code);while(i<len){if(code[i]=='0'){current=ht[current].lchild;// 走左子树}elseif(code[i]=='1'){current=ht[current].rchild;// 走右子树}// 判断是否为叶子节点(左右孩子都为0)if(ht[current].lchild==0&&ht[current].rchild==0){printf("%c",ht[current].ch);// 输出对应字符current=root;// 回到根节点}i++;}printf("\n");}

二、树的存储结构

  1. 双亲表示法

    • 使用结构数组存储每个节点,每个节点包含数据、权重、双亲下标、左右孩子下标等信息。
    • 优点:便于向上查找祖先节点,适合构造哈夫曼树;
    • 缺点:查找孩子节点效率低,需遍历整个数组。
  2. 孩子表示法

    • 每个节点保存一个链表或动态数组,记录所有孩子节点的下标或指针;
    • 适用于多叉树,如文件系统目录结构;
    • 查找孩子高效,但空间开销较大。
  3. 孩子兄弟表示法(左孩子-右兄弟表示法)

    • 每个节点包含两个指针:“第一个孩子” 和 “右兄弟”;
    • 可将任意树转化为二叉树形式进行存储和操作;
    • 特别适合递归遍历和森林转换为二叉树的应用场景。

这些存储方式广泛应用于数据压缩(如哈夫曼编码)、操作系统目录管理、编译器语法树构建等领域。
构建哈夫曼树并生成编码表是数据压缩中的核心步骤,主要包括两个阶段:建树编码生成。以下是详细过程与实现方法。


一、构建哈夫曼树(Huffman Tree)

基本思想:

采用贪心算法,每次从所有节点中选取权值最小的两个节点,合并成一个新的内部节点,其权值为两者之和,直到只剩一棵树。

步骤:
  1. 给定 n 个字符及其出现频率(或权重),每个字符作为叶子节点。
  2. 构造一个优先队列(最小堆),按权值排序。
  3. 重复以下操作 (n-1) 次:
    • 取出权值最小的两个节点 A 和 B;
    • 创建新节点 C,C 的权值 = A.权值 + B.权值;
    • 将 A 设为 C 的左孩子,B 为右孩子(或反之);
    • 将 C 插入优先队列。
  4. 最后剩下的节点即为哈夫曼树的根。
存储结构(双亲表示法数组):

使用结构体数组HTNode ht[2*n],索引从 1 开始:

typedefstruct{charch;// 字符intweight;// 权重intparent;// 双亲下标intlchild;// 左孩子下标intrchild;// 右孩子下标}HTNode;

初始化时,前 n 个节点为叶子节点(字符+权重),parent 初始为 0;后续 n-1 个节点用于存储合并后的非叶节点。

示例代码(C语言风格):
voidCreateHuffmanTree(HTNode ht[],intn){intm=2*n-1;for(inti=1;i<=m;i++){ht[i].parent=ht[i].lchild=ht[i].rchild=0;}for(intk=n+1;k<=m;k++){intmin1=9999,min2=9999;intx1=0,x2=0;// 找两个无父节点且权值最小的节点for(intj=1;j<k;j++){if(ht[j].parent==0&&ht[j].weight<min1){min2=min1;x2=x1;min1=ht[j].weight;x1=j;}elseif(ht[j].parent==0&&ht[j].weight<min2){min2=ht[j].weight;x2=j;}}// 合并两个节点ht[k].weight=min1+min2;ht[k].lchild=x1;ht[k].rchild=x2;ht[x1].parent=k;ht[x2].parent=k;}}

二、生成哈夫曼编码表

原理:

从每个叶子节点出发,逆向回溯到根节点,路径上每一步:

  • 走左分支记为'0'
  • 走右分支记为'1'
    由于是从下往上生成,需将结果反转得到正确编码。
方法:逐个叶子节点遍历
#include<string.h>voidGenerateHuffmanCode(HTNode ht[],charhcode[][20],intn){chartemp[20];inttop=0;for(inti=1;i<=n;i++){intcurrent=i;intparent=ht[i].parent;top=0;// 从叶子向上遍历至根while(parent!=0){if(ht[parent].lchild==current)temp[top++]='0';elsetemp[top++]='1';current=parent;parent=ht[parent].parent;}// 反转字符串并存入编码表temp[top]='\0';for(intj=0;j<top;j++){hcode[i][j]=temp[top-1-j];}hcode[i][top]='\0';}}
编码表示方式:

使用二维字符数组hcode[i][20]存储第 i 个字符的哈夫曼编码。


完整流程示例(以字符频率 {‘A’:5, ‘B’:9, ‘C’:12, ‘D’:13, ‘E’:16, ‘F’:45} 为例)

字符频率哈夫曼编码
A51100
B91101
C12111
D13100
E16101
F450

注意:编码不唯一(左右子树可互换),但总带权路径长度 WPL 是最优的。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/25 14:49:01

聚焦教育照明痛点,守护学生视力健康

近年来&#xff0c;全社会对上学生视力健康问题关注度持续提升&#xff0c;相关国家标准相继出台&#xff0c;在教育照明里&#xff0c;光环境质量直接影响学生视力健康与学习效率&#xff0c;这种情况下教育照明改造成了许多学校基础设施升级重点项目&#xff0c;科学合理照明…

作者头像 李华
网站建设 2026/2/24 5:40:54

YOLOv8补丁生成与应用:git format-patch与am

YOLOv8补丁生成与应用&#xff1a;git format-patch与am 在现代AI工程实践中&#xff0c;团队常面临这样一个场景&#xff1a;开发人员在本地完成了对YOLOv8模型推理逻辑的优化&#xff0c;但目标部署环境处于隔离网络中&#xff0c;无法直接拉取代码或推送分支。此时&#xff…

作者头像 李华
网站建设 2026/2/25 11:54:52

YOLOv8生成描述文本的可能性研究

YOLOv8生成描述文本的可能性研究 在智能摄像头自动播报“门口有陌生人逗留”&#xff0c;或盲人手持设备轻声提示“前方五米是红绿灯”时&#xff0c;背后往往不是单一模型的功劳。这类功能的核心&#xff0c;是将“看到的内容”转化为“听得懂的语言”。虽然当前多模态大模型如…

作者头像 李华
网站建设 2026/2/22 21:04:31

芯祥EMS3515/EMS3518/EMS3550耗尽型音频开关参数详细对比

EMS3515/EMS3518/EMS3550均是芯祥科技耗尽型音频开关,参数也有一定的差异&#xff0c;以在为总结参数对比1.:EMS3515单通道&#xff0c;单刀单掷(SPST)耗尽型音频开关&#xff0c;pin to pin替代FSA515 EMS3518双通道&#xff0c;单刀单掷(SPSTx2) 耗尽型音频开关&#xff0c;功…

作者头像 李华
网站建设 2026/2/22 19:39:21

YOLOv8硬件选型推荐:性价比GPU榜单

YOLOv8硬件选型推荐&#xff1a;性价比GPU榜单 在智能视觉应用爆发的今天&#xff0c;从无人机避障到工厂质检线&#xff0c;YOLO系列模型几乎无处不在。尤其是YOLOv8发布后&#xff0c;凭借其简洁高效的架构和强大的多任务能力&#xff0c;迅速成为开发者手中的“标配工具”。…

作者头像 李华
网站建设 2026/2/22 4:30:28

vuespringboot地方企业税务局网上电子政务申报系统_l1is4hdq

目录 具体实现截图项目介绍论文大纲核心代码部分展示可定制开发之亮点部门介绍结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作 具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;同时还支持Python(flask,django…

作者头像 李华