我有一个数组,其中索引兼作“项目集合的标识符”,数组的内容是一个组号。组号落入0..N的有限范围内,其中N <&lt; length_of_the_array。因此,每个条目都将被重复多次。目前,我必须使用2个字节来表示组号(可以是> 1000但是<6500),由于重复的性质,最终会占用大量内存。
是否存在空间优化此阵列的方法,因为完整的阵列可以进入多个MB大小。欣赏任何指向相关优化算法/技术的指针。仅供参考:使用的编程语言是cpp。
答案 0 :(得分:1)
您是否仍希望对任意元素进行有效的随机访问?或者您在考虑索引 - &gt;组映射的节省空间的序列化?
如果您仍然需要高效的随机访问,单个阵列查找也不错。最糟糕的是单个缓存未命中。实际上,最糟糕的是页面错误,或者更可能是TLB未命中,但如果它只有几MB,则不太可能。)
可以对已排序和运行长度的编码列表进行二进制搜索(通过搜索重复计数的前缀和数组),但只有在偶尔对列表进行排序以将重复项保持在一起时才有效。
如果重复项不能至少在某种程度上组合在一起,那么您可以做的事情并不多,这样就可以进行随机访问。
打包的12位条目可能不值得,除非这足以显着减少缓存未命中。一对乘法指令生成正确的地址,并且包含所需值的16b负载上的移位和屏蔽指令与高速缓存未命中相比没有太大的开销。对压缩位域的写访问速度较慢,并且不是原子的,因此这是一个严重的缺点。让编译器使用结构包装位域可以是特定于编译器的。也许只使用char数组是最好的。