编码 | 解码 | 压缩

> elias | delta | optimal <

// Elias Delta —— 对大整数比 Gamma 更高效的通用编码

0 字符
0 字符

>> 功能亮点

[高效]

优于 Gamma

对于 n > 3 的整数,比 Elias Gamma 更省比特。

[通用]

通用编码

无需任何额外参数,适用于任意正整数。

[渐近优化]

良好的渐近行为

使用 log₂(n) + 2log₂(log₂(n)) + 1 个比特。

>> 技术细节

Elias Delta 的工作原理

Elias Delta 将正整数 n 分为三步编码:1)计算 L = ⌊log₂(n)⌋ + 1(位长度);2)用 Elias Gamma 对 L 进行编码;3)附加 n 的低位 L−1 个比特。由于采用双对数增长形式,它在保持通用性的同时,比 Gamma 在大整数上更节省比特。

Delta 编码示例

n=1: L=1, Gamma(1)='1', bits='', Delta='1'
n=2: L=2, Gamma(2)='010', bits='0', Delta='0100'
n=3: L=2, Gamma(2)='010', bits='1', Delta='0101'
n=4: L=3, Gamma(3)='011', bits='00', Delta='01100'
n=16: L=5, Gamma(5)='00101', bits='0000', Delta='001010000'

长度对比:
n     | Gamma | Delta | 节省
1     | 1     | 1     | 0
16    | 9     | 9     | 0
100   | 13    | 12    | 1
1000  | 19    | 16    | 3

为什么选择 Elias Delta

  • 在 n > 3 时比 Gamma 更高效
  • 无需调参,开箱即用
  • 前缀码,唯一可解码
  • 适合中等大小整数的压缩场景
  • 是迈向 Elias Omega 的桥梁

>> 常见问题

什么是 Elias Delta 编码?

Elias Delta 是对 Elias Gamma 的改进:先用 Gamma 对整数二进制长度进行编码,再拼接剩余比特。它大约使用 log₂(n) + 2log₂(log₂(n)) + 1 个比特,对大整数更加高效。

Delta 和 Gamma 有什么区别?

Gamma 使用 2⌊log₂(n)⌋ + 1 比特,而 Delta 使用 log₂(n) + 2log₂(log₂(n)) + 1 比特。对于 n > 3,Delta 更省空间,且 n 越大节省越明显;对于 1–3 这样很小的整数,两者差别不大。

什么时候应该用 Delta 而不是 Gamma?

当你的数据主要是 n > 3 的整数时,推荐使用 Delta。若数据几乎都是 1–2 这样的极小整数,Gamma 可能略有优势。对于非常大的整数,可以考虑进一步改进的 Elias Omega。

Delta 是最好的 Elias 编码吗?

Delta 处于折中位置:Gamma 最简单但效率最低;Delta 提升了压缩率;Omega 对超大整数最省比特,但实现也最复杂。应根据数据分布和实现成本综合选择。