吃透大数据算法-数据压缩算法Run Length Encoding(RLE)
目录
一、场景故事:仓库管理员小李的 “偷懒” 记录法
二、10 种压缩算法对比:针对小李仓库场景的差异化处理
三、RLE算法选择的 “黄金法则”
一、场景故事:仓库管理员小李的 “偷懒” 记录法
小李是社区超市的仓库管理员,每天要手写记录货架上的商品排列 —— 比如货架 A 的序列是:
可乐、可乐、可乐、雪碧、雪碧、矿泉水、矿泉水、矿泉水、矿泉水、可乐、可乐、缺货、缺货、缺货
如果按 “逐个记录” 的方式写,要写 14 项,手酸还容易错。某天他灵光一闪:“连续重复的东西,记‘数量 + 商品’不就完了?”于是他把序列改成:
3 个可乐 → 2 个雪碧 → 4 个矿泉水 → 2 个可乐 → 3 个缺货
x3
x2
x4
x2
x3
只用 5 项就记完了,这就是 RLE(行程长度编码)的核心逻辑:找到 “连续重复的元素”(称为 “行程”),用 “重复次数 + 元素值” 的组合,替代原本冗长的重复序列,实现数据压缩。
就像生活中记录 “连续签到 7 天”(而非 “签到、签到…7 次”)、“连续堵车 3 公里”(而非 “堵车、堵车…3 公里”),本质都是 RLE 的思路 ——用 “计数” 减少 “重复描述” 的冗余。
二、10 种压缩算法对比:针对小李仓库场景的差异化处理
以下所有算法均围绕 “小李记录货架商品 / 数据” 的核心场景,对比其处理思想、适用场景与特点:
算法名称 | 同场景故事处理思想(以小李仓库为例) | 适用场景 | 核心特点 |
---|---|---|---|
Run Length Encoding(基础 RLE) | 直接将连续重复的商品序列替换为 “数量 + 商品”,如 “3 可乐、2 雪碧、4 矿泉水”,不优化 “数量” 或 “元素” 的存储格式。 | 有明显连续重复的序列(考勤、库存排列、黑白图像) | 1. 逻辑最简单,易实现;2. 重复越长,压缩率越高;3. 无重复时反而增加存储(需额外存 “数量 1”) |
Base 128 Varint | 不直接压缩商品,而是优化 “重复数量” 的存储:若小李要记 “130 个可乐”,传统 RLE 用 2 字节存 130,Base 128 Varint 用 “0x81(10000001)+0x01” 动态编码,小数量(如 3)仅用 1 字节。 | RLE 中 “重复数量” 波动大的场景(日志、二进制流、大库存计数) | 1. 动态调整计数的字节数,节省存储;2. 需额外解码步骤;3. 仅优化 “计数”,需配合 RLE 使用 |
Byte Run Length Encoding(Byte RLE) | 先将商品映射为 1 字节编码(可乐 = 0x01,雪碧 = 0x02),再对连续字节编码:“3 个可乐”=0x03(数量)+0x01(字节值)。 | 字节级连续重复的二进制数据(图片像素、二进制日志、文件碎片) | 1. 适配字节型数据,压缩效率高;2. 非字节数据需先转码;3. 适合底层二进制压缩 |
Boolean Run Length Encoding(Boolean RLE) | 若货架仅需记录 “有货(1)/ 缺货(0)”,则对连续布尔值编码:“3 个缺货”=“3+0”,“2 个有货”=“2+1”。 | 二值序列(开关状态、黑白图像、位掩码、传感器通断信号) | 1. 对二值数据压缩率极致(1 个计数 + 1 个布尔值代表连续序列);2. 仅支持两种值,通用性极差 |
Integer Run Length Encoding, version 1(Int RLE v1) | 针对 “商品数量” 这类整数序列:若小李记录 “3 箱、3 箱、3 箱、5 箱”,则编码为 “3 次 3 箱、1 次 5 箱”。 | 整数序列有连续重复(库存箱数、传感器固定读数、批次数量) | 1. 直接对整数重复优化,无需转码;2. 逻辑简单,解码快;3. 非重复整数压缩率低 |
Integer Run Length Encoding, version 2(Int RLE v2) | 优化 v1,支持 “重复 + 增量”:若小李记录 “3 箱、3 箱、4 箱、4 箱、5 箱”,编码为 “2 次 3 箱、2 次 + 1(4=3+1)、1 次 + 1(5=4+1)”,兼顾重复与小幅度递增。 | 整数序列有重复且含小增量(时间戳、批次号、渐变传感器数据) | 1. 压缩场景比 v1 更广(支持重复 + 增量);2. 解码逻辑稍复杂;3. 大增量时压缩率下降 |
Short Repeat | 专门优化 “短重复序列”:若小李货架多是 “2 罐可乐、3 瓶雪碧” 这类短重复,用 1 字节同时存 “数量(低 4 位)+ 商品编码(高 4 位)”,避免基础 RLE 的 “数量 + 商品” 双字节冗余。 | 以短重复为主的序列(文本重复字符、小批量零售库存、短周期传感器数据) | 1. 短重复(2-8 次)压缩效率极高,开销最小;2. 长重复(>8 次)不如基础 RLE;3. 适合小数据量场景 |
Direct(无压缩) | 若小李的货架商品完全无规律(可乐、雪碧、矿泉水、可乐、雪碧…),不做任何压缩,直接逐个记录每个商品 / 数据。 | 序列无重复或重复极少(随机数据、唯一商品 ID、加密数据) | 1. 无压缩 / 解码开销,读取速度最快;2. 存储成本最高;3. 是所有压缩算法的 “fallback 选项” |
Patched Base | 处理 “大部分重复 + 少量异常”:若小李货架有 “100 个可乐”,但第 50 位是雪碧,编码为 “基础:100 个可乐;补丁:第 50 位替换为雪碧”,用 “基础重复 + 局部补丁” 保留高压缩率。 | 高重复序列含少量异常值(日志中的偶发错误、图像噪点、库存中的临时缺货) | 1. 兼顾高重复压缩率与异常处理灵活性;2. 补丁数量越少,效率越高;3. 补丁过多时会增加额外存储 |
Delta(差值编码,常与 RLE 结合) | 针对 “有序递增 / 递减序列”:若小李记录商品编号 “101、102、103、103、104”,编码为 “基准 101,+1,+1,2 次(重复 + 0),+1”(结合 RLE),用 “差值” 替代原值。 | 有序整数序列(时间戳、自增 ID、时序传感器数据、批次编号) | 1. 有序序列压缩率极高(差值通常远小于原值);2. 必须依赖序列的有序性,无序序列不适用;3. 常与 RLE 结合处理 “重复差值” |
三、RLE算法选择的 “黄金法则”
小李的仓库场景揭示了RLE压缩算法的本质 ——没有 “最好”,只有 “最适配”:
- 看 “重复特性”:连续长重复用「基础 RLE」,短重复用「Short Repeat」,无重复用「Direct」;
- 看 “数据类型”:二值用「Boolean RLE」,字节用「Byte RLE」,整数用「Int RLE v1/v2」,有序整数用「Delta」;
- 看 “异常情况”:少量异常用「Patched Base」,数量波动大用「Base 128 Varint」。
所有算法的设计目标,都是在 “压缩率”“速度”“通用性” 三者间找平衡 —— 就像小李记录货架,最终目的是 “又快又省地记清楚”,而非追求 “最复杂的方法”。