CS61B 课程笔记(Lecture 38 Compression)
CS61B 课程笔记(Lecture 38 Compression)
压缩技术概述
压缩的定义与过程 压缩是减少文件大小的一种技术。通过压缩算法将文件内容缩减,之后通过解压缩算法可以恢复到原始文件。例如,将
mobydick.txt
文件压缩为mobydick.zip
后,文件大小显著减小,但解压后,原始内容保持不变。这种过程体现了无损压缩,即信息无丢失。压缩模型 1:基于位的算法 压缩可以理解为对一串二进制位应用压缩算法,解压缩则是应用逆压缩算法恢复数据。以
example.txt
压缩成example.zip
为例,压缩后文件的位数减少,解压后文件恢复为原始数据。
无前缀编码
前缀编码的基础概念 在编码中,若一个编码是另一编码的前缀,可能会导致歧义。例如,摩尔斯电码中 "-- -- •" 可以代表多个不同字符组合。为避免这种歧义,可以使用无前缀编码,即任何编码都不会是另一个编码的前缀。
Shannon-Fano 编码 Shannon-Fano 编码通过统计符号的出现频率,将频率较高的符号分配较短的编码,频率较低的符号分配较长的编码。虽然该方法可以生成无前缀编码,但并非最优算法,实际使用较少。
Huffman 编码 Huffman 编码通过自底向上的方法生成最优的无前缀编码。其核心思想是:
- 统计符号的相对频率;
- 将最小频率的两个符号合并为一个超级节点,重复该过程,直到生成完整的编码树。
数据结构与实践
- 编码与解码的实现
- 编码:可以使用
HashMap/TreeMap
来将字符映射到对应的位序列,或者使用数组存储字符与位序列的关系。数组操作速度更快,但可能占用更多内存。 - 解码:使用二进制前缀树 (Trie) 来存储编码。当接收到位流时,可以通过前缀树快速查找对应的字符。
- 编码:可以使用
- 实践问题
- 语料库压缩:根据大量输入样本创建标准的压缩编码,但此方法可能无法适用于特定的输入文件。
- 唯一编码:为每个输入文件生成唯一的编码,并在解码时发送编码表。虽然这种方法需要额外空间,但通常比语料库压缩更有效。
压缩理论
压缩比 压缩比是衡量压缩效率的指标。常用的压缩算法包括 Huffman 编码、游程编码(替换重复字符)和 LZW(利用输入模式的重复性)。这些算法的核心思想是利用数据中的冗余或规律性来减少数据大小。
自解压位流 自解压位流技术将压缩数据和解压算法打包在一起,形成一个可以自行解压的可执行文件。这种方法简化了压缩与解压的过程。
LZW 压缩 LZW 压缩基于发现输入数据中的模式,允许一个编码词表示多个符号。其核心算法是:
- 初始时,每个符号都有对应的编码;
- 当某个编码词被使用时,创建一个新的编码词代表该编码词与下一个符号的组合;
- 该算法可以从压缩位流中自行重建编码表,无需额外发送编码表。
总结
- 压缩模型:压缩算法通过对位流进行处理,生成更小的位流。
- 变长编码:常见符号使用较短的编码,稀有符号使用较长的编码,例如摩尔斯电码。
- 无前缀编码:确保没有编码是其他编码的前缀,以避免歧义。
- Shannon-Fano 编码:基于频率分割的无前缀编码,但非最优。
- Huffman 编码:一种自底向上生成最优无前缀编码的算法。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Totoroの旅!
评论