哈夫曼压缩核心是按频率构建最小堆二叉树并生成唯一变长编码:需以unsigned char统计0–255字节频次,自定义priority_queue升序比较器,合并时权重小者为左子树(编0),大者为右(编1),空文件或单字符需特判;编码表须按“字符+长度+对齐比特”二进制格式写入头部,并校验编码唯一性。
核心是:先统计字符频率,再用优先队列(最小堆)构建带权路径最短的二叉树,最后递归/迭代生成每个字符的编码。关键不在“写树”,而在「保证构建过程严格按权重合并」和「编码方向不能反」。
常见错误是把左子树当 1、右子树当 0(或反之),导致解码失败;或者没处理单字符输入(比如文件只含一个 'a'),堆里只剩一个节点时直接崩溃。
std::priority_queue 时必须自定义比较器,让它按 freq 升序——默认是大顶堆,得翻过来char 或 int),内部节点设为 -1 或 0 标记"0",进右子树拼 "1";别用 BFS,容易乱序且难回溯路径
struct Node {
int freq;
char ch;
Node* left;
Node* right;
Node(int f, char c) : freq(f), ch(c), left(nullptr), right(nullptr) {}
};
struct Compare {
bool operator()(Node* a, Node* b) { return a->
freq > b->freq; }
};
// 构建过程节选
std::priority_queue, Compare> pq;
// ... 插入所有叶子节点
while (pq.size() > 1) {
Node* l = pq.top(); pq.pop();
Node* r = pq.top(); pq.pop();
Node* merged = new Node(l->freq + r->freq, '\0');
merged->left = l;
merged->right = r;
pq.push(merged);
}
不能简单用 std::map 然后 fstream.get() 逐字节读——遇到空字符 '\0'、换行符 '\n'、高位字节(如 UTF-8 中文)会截断或误判。实际压缩对象是字节流,不是“字符流”。
unsigned char 视角读取文件,映射到 int 范围 [0, 255],用 std::array 统计最稳EOF 不算有效字节,istream::get() 返回 int,需判断是否等于 EOF 再转 unsigned char
total_count == 0 并跳过压缩std::arrayfreq{}; std::ifstream fin("input.bin", std::ios::binary); int byte; while ((byte = fin.get()) != EOF) { freq[static_cast (byte)]++; }
不能直接写字符串如 "a:010\nb:11\n"——这本身就在膨胀数据。标准做法是:先写字符(1 字节),再写其编码长度(1 字节),最后写编码比特(按字节对齐,高位在前)。
例如字符 'x' 编码是 "1011"(4 位),就写:0x78('x' 的 ASCII)、0x04、0xB0(10110000,后 4 位补零凑满 1 字节)。解压时靠长度字段截取有效比特。
0xFF),否则解压器无法知道头在哪结束std::string 拼接编码比特——它按字节存,而你需要按位写入,得手写 bit writer 类或用 std::vector(注意它不是容器,别用 data())小文件(
gzip 压过,再套哈夫曼只会更大——熵已经极低,变长编码失去优势最容易被忽略的是:没做「编码唯一性校验」。两个不同字符生成相同编码(比如都成了 "0"),整个压缩就不可逆。构建完树必须遍历所有叶子,确认无重复编码串——哪怕只是调试时用 std::set<:string> 临时塞一遍。
# node
# 编码
# 字节
# 后端
# c++
# ios
# 解压
# stream
# 为什么
# EOF
# String
# Array
# 字符串
# 结构体
# 递归
# char
# int
# 虚函数
# fstream
# 堆
# map
# 对象
# ASCII
# 子树
# 升序
# 英文
# 变长
# 自定义
# 时用
# 的是
# 成了
# 就在
相关文章:
如何解决ASP生成WAP建站中文乱码问题?
制作网页的网站有哪些,电脑上怎么做网页?
如何通过虚拟机搭建网站?详细步骤解析
如何快速生成ASP一键建站模板并优化安全性?
c# await 一个已经完成的Task会发生什么
网页设计与网站制作内容,怎样注册网站?
如何正确下载安装西数主机建站助手?
微课制作网站有哪些,微课网怎么进?
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
,石家庄四十八中学官网?
网站制作网站,深圳做网站哪家比较好?
北京制作网站的公司,北京铁路集团官方网站?
nginx修改上传文件大小限制的方法
如何用花生壳三步快速搭建专属网站?
建站之星代理如何优化在线客服效率?
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
如何正确选择百度移动适配建站域名?
已有域名和空间如何快速搭建网站?
c# 在ASP.NET Core中管理和取消后台任务
建站之星后台密码遗忘如何找回?
如何安全更换建站之星模板并保留数据?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
如何通过二级域名建站提升品牌影响力?
网站设计制作企业有哪些,抖音官网主页怎么设置?
香港网站服务器数量如何影响SEO优化效果?
定制建站流程解析:需求评估与SEO优化功能开发指南
网站微信制作软件,如何制作微信链接?
如何在IIS管理器中快速创建并配置网站?
如何快速搭建个人网站并优化SEO?
建站之星安装模板失败:服务器环境不兼容?
如何通过虚拟主机快速搭建个人网站?
如何通过万网虚拟主机快速搭建网站?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
如何在腾讯云服务器上快速搭建个人网站?
简单实现Android文件上传
岳西云建站教程与模板下载_一站式快速建站系统操作指南
重庆网站制作公司哪家好,重庆中考招生办官方网站?
如何在阿里云ECS服务器部署织梦CMS网站?
如何注册花生壳免费域名并搭建个人网站?
建站DNS解析失败?如何正确配置域名服务器?
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
如何快速生成橙子建站落地页链接?
建站之星CMS五站合一模板配置与SEO优化指南
如何破解联通资金短缺导致的基站建设难题?
行程制作网站有哪些,第三方机票电子行程单怎么开?
建站VPS配置与SEO优化指南:关键词排名提升策略
威客平台建站流程解析:高效搭建教程与设计优化方案
香港服务器网站卡顿?如何解决网络延迟与负载问题?
实例解析Array和String方法
实惠建站价格推荐:2025年高性价比自助建站套餐解析
*请认真填写需求信息,我们会在24小时内与您取得联系。