【问题标题】:How to store set of numbers [closed]如何存储一组数字[关闭]
【发布时间】:2014-02-07 21:33:16
【问题描述】:

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

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

你能找到更好的方法吗?

【问题讨论】:

  • 从技术上讲,普通位向量占用更多空间,但它仍然只有 6 MiB,而且所有操作都很快,甚至可能比布隆过滤器更快。它也更容易实现(我敢说微不足道)。
  • 在我的情况下,空间比速度更重要
  • std::set 应该具有显着的每个条目开销(整个节点加上每个 int 的分配器元数据);一个普通的排序数组或其他节省空间的数据结构应该节省一些空间。

标签: data-structures compression bloom-filter


【解决方案1】:

不是 0 到 50,000,000 的范围,而是 65,536 的 1,024 个单独的范围呢?这会给你一个 64 MB 的范围。我想您可以将其设为 763 而不是 1,024,这将给您 50,003,968。

类似ushort[763][];

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

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

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

这将执行得更快,比您的布隆过滤器方法更小,没有误报,并且更容易实现。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-02-05
      • 2012-09-14
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      相关资源
      最近更新 更多