哈夫曼树

raw/articles/2026/05/哈夫曼树

一句话总结

霍夫曼树是二叉树结构的经典应用,它是一种最优前缀编码树,常用于数据压缩。

核心内容

数据压缩基础

无损压缩 vs 有损压缩

类型 特点 示例
无损压缩 压缩后数据可完全还原,不丢失任何信息 zip 压缩包
有损压缩 压缩后数据会丢失一些信息,但压缩率更高 图片压缩(降低色度精度)

无损压缩的本质:编码和解码过程。压缩效果取决于算法能否充分挖掘原始数据中的冗余信息。

权衡三角:通用性 ↔ 压缩率 ↔ 性能

定长编码 vs 变长编码

编码方式 特点 优势 劣势
定长编码(如 ASCII) 每个字符编码长度固定(如 8 位) 可随机访问(按索引计算位置) 存储效率低
变长编码(如 UTF-8) 每个字符编码长度可变(1-4 字节) 存储效率高 无法随机访问

示例aaabacc 字符串

  • 定长编码(2 比特/字符):00 00 00 01 00 10 11 = 14 比特
  • 变长编码(a=0, b=10, c=11):0 0 0 10 0 11 11 = 10 比特

变长编码的三大难点

  1. 解码唯一性:如何设计编码保证无歧义?

    • 核心原则:任意一个编码都不能是另一个编码的前缀(前缀码)
    • 违反示例:a=1, b=10, c=11 → 11 可解码为 caa
  2. 压缩率:如何让编码数据尽可能短?

    • 高频字符用短编码,低频字符用长编码
  3. 解码效率:如何保证解码速度?

    • 保证前缀无歧义性后,解码复杂度从 O(NK) 降到 O(N)
    • 其中 N 为编码数据长度,K 为最长编码长度

哈夫曼编码

定义:哈夫曼编码是一种通用无损压缩算法,通过构建最优前缀编码树(哈夫曼树)来实现数据压缩。

工作原理

  1. 输入原始数据,统计字符频率
  2. 构建哈夫曼树(最优前缀编码树)
  3. 生成编码表(码表)
  4. 根据码表编码数据
  5. 解码时根据码表还原原始数据

优化目标:使所有字符的(频率 × 编码长度)之和最小。

关键要点

  • 哈夫曼树是二叉树结构的经典应用
  • 前缀码(任意编码不是其他编码的前缀)是保证解码唯一性的关键
  • 变长编码通过给高频字符分配短编码来优化压缩率
  • 哈夫曼编码是通用无损压缩算法,需要码表进行解码

待补充内容

⚠️ 本文内容不完整(原文使用 JavaScript 动态加载,仅获取到 141 行静态内容):

  • 哈夫曼树的构建算法(贪心策略)
  • 哈夫曼编码的具体实现(Java 代码)
  • 基于哈夫曼编码的压缩程序实现
  • 与其他压缩算法的详细对比

相关概念

以下概念首次在此文提及,暂未创建独立页面(需 ≥2 篇来源):

  • 数据压缩(Data Compression)
  • 无损压缩(Lossless Compression)
  • 有损压缩(Lossy Compression)
  • 定长编码(Fixed-Length Encoding)
  • 变长编码(Variable-Length Encoding)
  • 前缀码(Prefix Code)
  • 哈夫曼树(Huffman Tree)
  • 哈夫曼编码(Huffman Coding)

相关概念

  • 二叉树:哈夫曼树的基础数据结构

相关实体


Interactive Graph