RLE样式压缩的数据结构

时间:2010-02-17 14:16:32

标签: java data-structures compression

假设我的数字来自1-10万(客户ID)。每个单个数字与3个可能值中的1个相关联 - A,B,C。

我知道大约1000个元素的非常大的相邻区域属于同一类别。

什么是允许我以节省内存的方式在数字范围和类别之间保存链接的数据结构?

另外,是否有一个区间树的java实现,这是在答案中提出的。

3 个答案:

答案 0 :(得分:1)

创建3个间隔树,或(开始,结束)对的排序图,每个对代表A,B和C类。

答案 1 :(得分:1)

首先转置您的数据结构,t.i。而不是存储客户 - >类别(A / B / C)映射,存储类别 - >客户映射。我发现转换是设计非常有效的数据结构的常用且很酷的方法。

现在,为3个A,B,C表中的每一个使用3个位图(位掩码,像java.util.BitSet这样的位集)。 A表中的第i位将告知客户编号“i”是否属于A类。

这些表中的每一个只占用N / 8字节的内存,对于10ml的客户而言只需3.75mb。

(请注意,只有当您的客户ID为连续整数时才会起作用)

答案 2 :(得分:0)

您可以使用一些棘手的逻辑尝试使用Google Collections中的LinkedListMultimap。

什么是棘手的逻辑:每个奇数值代表间隔的开始,每个偶数值代表间隔的结束。

例如,A中有1001-1100个ID,B中有1101-1300个,A中有1301-1400个

multimap.put (A, 1001); 
multimap.put (A, 1100);

multimap.put (B, 1101);
multimap.put (B, 1300);

multimap.put (A, 1301);
multimap.put (A, 1400);