Delta-of-Delta 算法
提问
有个需求,让你压缩一列时间戳,想一想,怎么做
以下是纳秒精度时间戳
1616047412408692000
1616047412408692001
1616047412408692002
1616047412408692002
1616047412408692005
1616047412408692005
1616047412408692010
…
回答
- 记录首个时间戳 + 每个时间戳与首个的差值
时间戳 | 实际记录值 |
---|---|
1616047412408692000 | 1616047412408692000 |
1616047412408692001 | 1 |
1616047412408692002 | 2 |
1616047412408692002 | 2 |
1616047412408692005 | 5 |
1616047412408692005 | 5 |
1616047412408692010 | 10 |
- 记录首个时间戳 + 他们与上一个数字的差值
时间戳 | 实际记录值 |
---|---|
1616047412408692000 | 1616047412408692000 |
1616047412408692001 | 1 |
1616047412408692002 | 1 |
1616047412408692002 | 0 |
1616047412408692005 | 3 |
1616047412408692005 | 0 |
1616047412408692010 | 5 |
第2种方法明显比第1种更节约空间,它只需要记录变化值,而这个变换值在连续时间线下是很小的。
它在压缩数据上做的很好,我们把这个方案叫delta压缩。然而请想想它有什么缺点呢?
计算,我们必须得知道第一个时间戳,再依次计算每个变化量,才得到一个指定时间点。
而第1种方案,只需要计算一次即可。
主角登场
那么我们的压缩可以再进一步吗?
Delta-of-Delta
时间戳 | delta | delta-of-delta |
---|---|---|
1616047412408692000 | 1616047412408692000 | 1616047412408692000 |
1616047412408692001 | 1 | 1 |
1616047412408692002 | 1 | 0 |
1616047412408692002 | 0 | -1 |
1616047412408692005 | 3 | 3 |
1616047412408692005 | 0 | -3 |
1616047412408692010 | 5 | 5 |
它只需要计算当前增长幅度的变化情况
我的理解是,delta记录了增长幅度,而delta-of-delta记录的是增长幅度的变化情况。
它更适合增长幅度稳定的时间戳记录