当前位置: 首页 > article >正文

别再死记硬背了!用C++手把手带你图解哈夫曼树构建全过程(附完整可运行代码)

从零开始用C动态图解哈夫曼树构建与编码实现哈夫曼树Huffman Tree是数据结构中一种经典的贪心算法应用广泛用于数据压缩领域。对于初学者来说理解其构建过程往往比单纯记忆代码更有价值。本文将用C结合动态图示的方式带你一步步拆解哈夫曼树的构建全过程并实现完整的编码功能。1. 哈夫曼树基础概念哈夫曼树是一种带权路径长度最短的二叉树主要用于优化字符编码。假设我们有字符集{A,B,C,D}出现频率分别为{15,7,6,5}传统的等长编码需要2位表示每个字符而哈夫曼编码能根据频率动态调整编码长度。核心特性频率高的字符编码更短前缀无歧义任一编码不是另一编码的前缀构建过程基于贪心算法struct HuffmanNode { int weight; // 权重值 char ch; // 字符可选 int parent; // 父节点索引 int lchild; // 左孩子索引 int rchild; // 右孩子索引 };2. 构建哈夫曼树的完整流程2.1 初始化森林假设我们有5个字符及其权重字符权重A5B9C12D13E16初始化时每个字符作为一个独立的树A(5) B(9) C(12) D(13) E(16)2.2 选择与合并每次选择权重最小的两棵树合并直到只剩一棵树第一轮选择A(5)和B(9)合并为N1(14)第二轮选择C(12)和D(13)合并为N2(25)第三轮选择N1(14)和E(16)合并为N3(30)第四轮选择N2(25)和N3(30)合并为N4(55)void selectMinTwo(HuffmanNode* nodes, int range, int s1, int s2) { s1 s2 -1; for (int i 0; i range; i) { if (nodes[i].parent ! -1) continue; // 已合并的节点跳过 if (s1 -1 || nodes[i].weight nodes[s1].weight) { s2 s1; s1 i; } else if (s2 -1 || nodes[i].weight nodes[s2].weight) { s2 i; } } }2.3 构建过程可视化下表展示了完整的构建过程步骤操作森林状态初始-A(5), B(9), C(12), D(13), E(16)1合并AB → N1(14)N1(14), C(12), D(13), E(16)2合并CD → N2(25)N1(14), N2(25), E(16)3合并N1E → N3(30)N2(25), N3(30)4合并N2N3 → N4(55)N4(55)3. 哈夫曼编码实现3.1 从树到编码构建完成后从根节点出发左路径标记0右路径标记1A: 00 B: 01 C: 100 D: 101 E: 113.2 编码实现代码void generateCodes(HuffmanNode* nodes, string* codes, int n) { for (int i 0; i n; i) { int child i; int parent nodes[child].parent; while (parent ! -1) { if (nodes[parent].lchild child) { codes[i] 0 codes[i]; } else { codes[i] 1 codes[i]; } child parent; parent nodes[parent].parent; } } }4. 完整可运行示例下面是一个完整的C实现包含构建和编码功能#include iostream #include string #include climits using namespace std; struct HuffmanNode { int weight; char ch; int parent, lchild, rchild; }; void buildHuffmanTree(HuffmanNode* nodes, int n) { for (int i n; i 2*n-1; i) { int s1, s2; selectMinTwo(nodes, i, s1, s2); nodes[s1].parent nodes[s2].parent i; nodes[i].lchild s1; nodes[i].rchild s2; nodes[i].weight nodes[s1].weight nodes[s2].weight; nodes[i].parent -1; } } int main() { const int n 5; HuffmanNode nodes[2*n-1] { {5,A,-1,-1,-1}, {9,B,-1,-1,-1}, {12,C,-1,-1,-1}, {13,D,-1,-1,-1}, {16,E,-1,-1,-1} }; buildHuffmanTree(nodes, n); string codes[n]; generateCodes(nodes, codes, n); for (int i 0; i n; i) { cout nodes[i].ch : codes[i] endl; } return 0; }5. 性能优化与注意事项5.1 选择算法的优化原始实现的时间复杂度是O(n²)可以使用优先队列优化到O(n log n)#include queue using namespace std; void optimizedSelect(HuffmanNode* nodes, int n) { auto cmp [](int a, int b) { return nodes[a].weight nodes[b].weight; }; priority_queueint, vectorint, decltype(cmp) pq(cmp); for (int i 0; i n; i) { if (nodes[i].parent -1) pq.push(i); } // 获取最小两个节点 int s1 pq.top(); pq.pop(); int s2 pq.top(); pq.pop(); }5.2 内存管理对于大型数据集建议使用动态内存分配HuffmanNode* createHuffmanTree(int* weights, char* chars, int n) { HuffmanNode* nodes new HuffmanNode[2*n-1]; // 初始化代码... return nodes; }5.3 实际应用建议对于静态数据如固定字符集可以预计算哈夫曼树动态数据需要定期重建编码表编码表通常需要与压缩数据一起存储哈夫曼编码虽然效率不是最高的但其算法思想在面试和教学中经常出现。理解其构建过程比记住代码更重要这也是本文采用图解方式讲解的原因。在实际项目中可以考虑更高效的算术编码或LZ系列算法。

相关文章:

别再死记硬背了!用C++手把手带你图解哈夫曼树构建全过程(附完整可运行代码)

从零开始:用C动态图解哈夫曼树构建与编码实现 哈夫曼树(Huffman Tree)是数据结构中一种经典的贪心算法应用,广泛用于数据压缩领域。对于初学者来说,理解其构建过程往往比单纯记忆代码更有价值。本文将用C结合动态图示的…...

3个极简功能让时间管理者实现高效时间规划:Catime计时器全场景应用指南

3个极简功能让时间管理者实现高效时间规划:Catime计时器全场景应用指南 【免费下载链接】Catime A tiny (995KB) but mighty timer in pure C. Supports clock, countdown, stopwatch, Pomodoro, and fully customizable tray animations (GIFs, CPU/Mem%)&#x1f…...

港科喜讯|[港科百创]参赛项目上市!视觉语言大模型第一股诞生!

2026年3 月 30 日,山东极视角科技股份有限公司(股票代码:6636.HK)在香港联合交易所主板正式上市。这家曾斩获香港科技大学第六届百万奖金国际创业大赛深圳赛区一等奖的科创企业,同时也是香港科大"创科行"(第…...

手把手教你用Transceiver Wizard搞定UltraScale FPGA的GTY时钟网络规划

手把手教你用Transceiver Wizard搞定UltraScale FPGA的GTY时钟网络规划 在FPGA高速收发器设计中,时钟网络的合理规划往往是决定系统稳定性的关键因素。对于刚接触Xilinx UltraScale架构的开发者来说,GTY收发器的时钟分配规则就像一座迷宫——相邻Bank共享…...

通义千问Qwen2-VL模型部署避坑指南:如何用transformers库绕过Flash-Attention2安装

通义千问Qwen2-VL模型轻量化部署实战:避开Flash-Attention2的安装陷阱 最近在测试通义千问的多模态模型Qwen2-VL时,发现官方推荐的Flash-Attention2依赖项安装过程异常繁琐,不仅编译耗时数小时,还经常因环境配置问题报错。经过多次…...

港科夜闻 | 香港科大“长者护脑社区计划“为6,000名长者提供阿尔兹海默症早筛

关注并星标每周阅读港科夜闻建立新视野 开启新思维1、香港科技大学3月23日宣布推出为期五年的 “长者护脑社区计划”。这项开创性计划以社区为本,旨在为香港基层长者提供阿尔兹海默症及轻度认知障碍的早期检测。香港科大将联同东华学院及十多间社福机构,…...

Qwen3.5-9B-AWQ-4bit电路仿真辅助:Multisim设计文档自动生成与解析

Qwen3.5-9B-AWQ-4bit电路仿真辅助:Multisim设计文档自动生成与解析 1. 电子工程师的设计痛点 每个电子工程师都经历过这样的场景:深夜加班赶项目,面对复杂的Multisim电路图,需要手动整理几十页的设计文档。元件清单、信号流分析…...

HDMI接口没声音?手把手教你用InfoFrame调试音频流(附Audio InfoFrame解析)

HDMI音频调试实战:用Audio InfoFrame精准定位无声问题 当4K显示器亮起而音响沉默时,工程师的调试噩梦就开始了。上周在调试一块定制开发板时,HDMI视频输出完美,但音频系统始终沉默——这不是简单的"线材接触不良"能解释…...

Streamlit+像素风=高效零售AI?Ostrakon-VL部署完整指南

Streamlit像素风高效零售AI?Ostrakon-VL部署完整指南 1. 项目概览:当零售AI遇上像素艺术 想象一下,你正在玩一款90年代的复古游戏,但这次你不是在打怪升级,而是在用AI分析零售店铺的货架陈列。这就是Ostrakon-VL扫描…...

深入解析内存分区:程序运行的秘密

一、完整内存分区(进程地址空间)一个程序跑起来,操作系统会给它分配虚拟内存空间,并严格分成这些区域:代码区(Text Segment)数据区(Data Segment)—— 已初始化全局 / 静…...

深度学习篇---全局平均池化(Global Average Pooling, GAP)

全局平均池化是深度学习中一个优雅而强大的操作,它通过极简的设计解决了全连接层参数量爆炸的问题,同时增强了模型的泛化能力。 一、什么是全局平均池化? 1. 基本定义 全局平均池化是对每个特征通道的所有空间位置取平均值,将三…...

解决SlowFast环境配置中的‘No module named torch._six’等疑难杂症:从修改压缩包到调整import路径

SlowFast环境配置深度排障指南:从源码修改到路径调整的完整解决方案 在视频理解领域,SlowFast作为Facebook Research开源的优秀框架,凭借其双路径网络设计在动作识别任务中表现出色。然而,许多开发者在环境配置阶段就会遭遇各种&q…...

PDF-Parser-1.0效果实测:中文识别超99%,表格公式完美提取

PDF-Parser-1.0效果实测:中文识别超99%,表格公式完美提取 1. 开篇实测体验 当我第一次使用PDF-Parser-1.0处理一份15页的技术文档时,结果让我感到惊讶。这份文档包含复杂的中英文混排内容、3个跨页表格和5个数学公式,传统OCR工具…...

告别GitHub下载卡顿:手把手教你配置Electron国内镜像(npmrc文件详解)

告别Electron下载困境:深度解析.npmrc配置与国内镜像实战指南 每次执行npm install electron时,看着进度条卡在node install.js阶段一动不动,或是突然蹦出RequestError: connect ETIMEDOUT的红色报错——这种体验对于国内开发者来说再熟悉不过…...

GG3M 项目独家原创理论:元模型的形式化结构

GG3M 项目独家原创理论:元模型的形式化结构本元模型是GG3M 贾子公理体系的形式化数学内核,是对全尺度复杂系统(个人认知、企业经营、城市治理、国家战略、文明演化)底层规律的顶层抽象,是 GG3M 所有子模型、应用场景、…...

Ubuntu下USRP X300 FPGA固件降级实录:从‘need 38 but got 39’报错到完美兼容GNURadio

Ubuntu下USRP X300 FPGA固件降级实战:从版本冲突到完美兼容GNURadio的完整指南 当USRP X300的FPGA固件版本与GNURadio所需的版本不匹配时,终端里那个刺眼的"need 38 but got 39"报错足以让任何软件无线电开发者抓狂。这种版本冲突问题在Ubuntu…...

macOS安装OpenClaw全流程:Qwen2.5-VL-7B图文模型调试技巧

macOS安装OpenClaw全流程:Qwen2.5-VL-7B图文模型调试技巧 1. 为什么选择OpenClawQwen2.5-VL组合 去年冬天第一次接触OpenClaw时,我正被重复性的截图标注工作折磨得焦头烂额。当时尝试过几个自动化工具,要么功能太局限,要么需要把…...

大模型预训练中的损失函数:从交叉熵到代码实现的全方位解析

大模型预训练中的损失函数:从交叉熵到代码实现的全方位解析 在深度学习领域,大语言模型的崛起彻底改变了自然语言处理的格局。这些庞然大物的核心驱动力之一,正是预训练阶段精心设计的损失函数。对于decoder-only架构的模型而言,交…...

互联网大厂Java求职面试实录:谢飞机的三轮技术问答与深度解析

互联网大厂Java求职面试实录:谢飞机的三轮技术问答与深度解析 一、面试背景简介 本文模拟了某知名互联网大厂Java研发工程师岗位的面试过程,通过主角谢飞机与严肃面试官的真实问答,覆盖Java后端开发常见知识点,帮助读者系统梳理面…...

Claude Code编程助手实践:辅助编写cv_resnet101模型调用代码

Claude Code编程助手实践:辅助编写cv_resnet101模型调用代码 不知道你有没有过这样的经历:项目急着要上线,需要调用一个像ResNet101这样的图像分类模型,但对着API文档,光是搞明白参数怎么传、返回结果怎么解析&#x…...

Omni-Vision Sanctuary 集成 MySQL 数据库:自动化图像元数据管理与检索方案

Omni-Vision Sanctuary 集成 MySQL 数据库:自动化图像元数据管理与检索方案 1. 场景痛点与解决方案 数字内容创作领域正面临一个普遍挑战:随着AI生成图像的爆发式增长,如何高效管理海量图片资产成为棘手问题。某电商设计团队负责人曾向我们…...

Qwen3-14B镜像部署指南:单卡RTX 4090D上快速启用中文大模型推理

Qwen3-14B镜像部署指南:单卡RTX 4090D上快速启用中文大模型推理 1. 镜像概述与核心优势 Qwen3-14B私有部署镜像是专为RTX 4090D显卡优化的中文大模型推理解决方案。这个镜像最大的特点就是"开箱即用"——所有环境依赖、模型权重、优化组件都已预装配置好…...

Spring AI实战:5分钟搞定豆包TTS语音合成(附完整Java代码)

Spring AI实战:5分钟集成豆包TTS语音合成(附完整Java代码) 语音合成技术正在重塑人机交互的边界。作为Java开发者,你可能已经注意到Spring AI生态的快速崛起——它正成为企业级AI应用开发的新标准。本文将带你用最短时间完成豆包T…...

OpenClaw技能组合:Qwen2.5-VL-7B串联多个自动化任务流

OpenClaw技能组合:Qwen2.5-VL-7B串联多个自动化任务流 1. 为什么需要任务流串联 上周我需要完成一个市场竞品分析的周报,整个过程让我意识到手动操作的效率瓶颈。首先要在电商平台截图商品页面,然后用OCR工具提取价格信息,接着把…...

Phi-4-mini-reasoning开源模型教育价值:高校AI课程实验设计与评估标准

Phi-4-mini-reasoning开源模型教育价值:高校AI课程实验设计与评估标准 1. 引言:AI教育的新工具 在人工智能教育领域,如何让学生既能理解前沿技术原理,又能获得实际动手能力,一直是教学设计的难点。Phi-4-mini-reason…...

帆软FineDB数据库驱动上传权限配置与实战指南

1. 为什么需要配置数据库驱动上传权限 在企业级报表开发中,经常会遇到需要连接特殊数据库的场景。帆软报表平台默认只内置了常见数据库的驱动,比如MySQL、Oracle这些。但实际项目中,我们可能需要连接达梦、GBase这些国产数据库,或…...

Android开发秘籍:给图片加上独特水印

Android开发秘籍:给图片加上独特水印 为什么要给图片加水印 在当今这个信息飞速传播的时代,图片作为一种直观且富有表现力的信息载体,在我们的生活和工作中无处不在。无论是在社交媒体上分享的精美摄影作品,还是电商平台上展示的…...

效果对比:Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF在多轮对话与复杂指令跟随上的表现

效果对比:Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF在多轮对话与复杂指令跟随上的表现 1. 模型能力概览 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF(以下简称"推理蒸馏模型")是一款专注于复杂推理和多轮对…...

RAGFlow源码部署避坑大全:从Poetry安装失败到NLTK资源缺失的完整修复指南

RAGFlow源码部署全攻略:从环境搭建到疑难解析的终极指南 1. 环境准备与系统要求 在开始RAGFlow的部署之前,确保您的系统满足以下最低配置要求:硬件配置: CPU:4核及以上内存:16GB及以上存储:50GB…...

CasRel在企业搜索中的应用:构建结构化语义索引提升召回质量

CasRel在企业搜索中的应用:构建结构化语义索引提升召回质量 1. 引言:当搜索遇到瓶颈 你有没有遇到过这种情况:在公司内部的知识库里搜索“2024年第三季度华东区的销售数据”,结果返回了一堆包含“销售”、“数据”、“华东”等关…...