如何存储一组数字

时间:2014-02-07 21:33:16

标签: data-structures compression bloom-filter

我有一组1,000,000个唯一号码。数字介于0和50,000,000之间。考虑一下,数字是随机的。我需要一个可以容纳它们的数据结构。数据结构应该需要尽可能少的内存。应该可以快速找到数字是否在集合中没有错误。

我找到了一个带有bloom过滤器的解决方案。是的,布隆过滤器有误报概率,但由于“只有”50,000,000个可能的数字,我可以找到所有错误并将它们保存在std :: set中。通过这种方法,我可以将所有数字存储在2.3MB的内存中。

你能找到更好的方法吗?

2 个答案:

答案 0 :(得分:1)

而不是0到50,000,000的范围,大约1,024个单独范围65,536?这会给你一个64 MB的范围。我想你可以把它变成763而不是1,024,它会给你50,003,968。

ushort[763][];

这样的东西

现在您要存储1,000,000个16位值而不是32位值。

行中的值已排序。因此,要确定数字是否在集合中,您将数字除以763以确定要查找的数组,然后在number % 65536上进行二进制搜索。

数字本身的存储空间为2,000,000字节。加上阵列的少量开销。

执行速度更快,比Bloom过滤器方法更小,没有误报,并且更容易实现。

答案 1 :(得分:1)

存储此类向量的最小空间通常为884,002字节。它将整数索引(一个非常大的整数)存储到50,000,000个1,000,000中所有可能选择的列表中。

您可以通过简单,快速的字节编码来接近它。给定排序的数字列表,将每个数字替换为与最后一个数字的差异。 (假设-1在第一个数字之前。)差异都是一个或多个,所以减去一个。如果结果为254或更小,则将其编码为字节。否则,写入255,然后使用差异较大的两个字节减去255.如果它不适合,则写入三个255,然后用三个字节跟随差异。这几乎总是以小于1,012,000字节的速度对矢量进行编码。