压缩率
数据压缩中,压缩后数据大小与原始数据大小的比率。文本数据冗余度较高,通常可以达到 60% 至 80% 的压缩率。
压缩率 (compression ratio) 是衡量数据压缩效率的指标。设原始数据大小为 D、压缩后大小为 C,则压缩率 = (1 - C/D) x 100%。一个 100KB 的文本文件压缩到 25KB,压缩率就是 75%。压缩率越高,意味着用更少的存储空间或网络带宽就能处理数据。
文本数据相比图片和视频,往往能获得更高的压缩率。自然语言文本中存在大量冗余 - 字符出现频率的偏差 (英语中"e"出现最频繁)、单词的重复、固定搭配等。英语文本用 gzip 压缩通常可获得 60% 至 70% 的压缩率。中文文本 (UTF-8 编码) 的压缩率约为 50% 至 65%,略低于英语。这是因为汉字种类繁多,字符出现频率的偏差不如英语那样极端。不过中文每个字承载的信息量更大,同等语义内容下中文原文本身就比英文短。
在 Web 领域,HTTP 响应的 gzip/Brotli 压缩能大幅减少文本数据的传输量。HTML、CSS、JavaScript 都是文本数据,压缩效果显著。Brotli 比 gzip 能多获得 15% 至 25% 的压缩率,且主流浏览器均已支持。一个 10KB 的 HTML 文件经 Brotli 压缩到 2.5KB,页面加载时间的缩短是用户可以明显感知的。
文本压缩算法大致分为两类。哈夫曼编码根据字符出现频率分配可变长度的比特序列,频繁出现的字符用更短的比特表示。LZ77/LZ78 系列算法检测文本中的重复模式,用"之前出现的位置和长度"来引用。gzip 使用的 DEFLATE 算法结合了这两种方法。
字符数与压缩率之间存在有趣的关系。相同字符数的文本,内容不同压缩率可能差异巨大。"啊啊啊啊啊啊啊啊啊啊" (同一字符重复) 能获得极高的压缩率,而随机字符串几乎无法压缩。这与信息论中的熵 (信息量) 概念直接相关 - 冗余度越高的文本,压缩率越高。
在实际应用中,压缩率直接关系到存储成本和网络带宽的优化。保存大量日志文件或聊天记录时,文本压缩可以将存储成本降低 60% 至 80%。API 响应的压缩能缩短移动网络下的响应时间,提升用户体验。文本越长,压缩的效果越明显,因此长篇内容的分发中,是否启用压缩会对性能产生显著差异。