> 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 对超大整数最省比特,但实现也最复杂。应根据数据分布和实现成本综合选择。