我有一个非常特定的数据集,需要以最紧凑的方式存储为字节数组。它是整数的实时流,不断增加,经常增加一个,但并不总是增加一个。每个整数值都有一个标记,它是一个字节值。可能会有具有相同值和标记的值,但我只需要存储区别。只有受支持的操作才能添加新元素,删除元素并检查元素是否存在-我保留此数据集以检查是否最近有“配对”过。
一些样本数据:
# | value | tag |
1 | 1000 | 0 |
2 | 1000 | 1 |
3 | 1000 | 2 |
4 | 1001 | 0 |
5 | 1002 | 2 |
6 | 1004 | 1 |
7 | 1004 | 2 |
8 | 1005 | 0 |
正如我所说的,这是一个实时流,但是我只能容忍最后几千个存储。目标是使其在存储(和RAM)中尽可能高效地利用内存,操作可能会花费很多。
如果没有标签,则可以存储范围或值,(1000-1002),(1002-1005)等,通常一行中大约有5-6个值而没有间隔。但是标签把这一切弄糟了。
我当前的方法是将每个值+标记对编码为几个字节-标记为一个字节,标记“ delta”为1个或多个字节。这样,我需要存储第一个值(在上述情况下为1000),然后我要存储增量-#1,#2,#4的1,#5的1,#6的2等。
大多数增量都在1-10的范围内,因此我只能将其存储在一个字节中-如果值足够小以适合7位,则第一个位是一个标志;否则,我可以将其存储-接下来的7位将存储一个值,该值表示字节增量的占用率。
也许有更好,更紧凑的方法?
由于只有127个不同的标记值,因此您可以维护127个不同的表,每个标记一个表,从而使您不必存储标记。在每个表中,您仍可以使用带有差值的漂亮技巧。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句