用于存储大型数据集的数据结构

时间:2015-01-13 07:38:19

标签: c++ algorithm performance data-structures large-data

我有数百万个随机正负32位整数需要存储在某些数据结构中。如果数据结构已包含该特定值,则必须退出该函数。你能否建议一些高效内存的数据结构来实现这个目标? 感谢

3 个答案:

答案 0 :(得分:1)

如果您愿意接受一些误报,我建议您使用Bloom Filter

每个元素只使用10位和7个散列函数,你的误报概率不到1%,根本没有假阴性。

答案 1 :(得分:0)

就记忆效率而言,由于所有数据都打包在一起,因此难以击败std::vector。而且由于您必须快速搜索,最好将它们存储为已排序,以便您可以对它们进行二进制搜索。

除非你能:

  • 使用线性预测压缩数字本身并以差分方式(或任何更高阶多项式)对它们进行编码:这使得打包更有效,但却无法直接访问(广告二进制搜索)
  • 如果这些数字是彼此独立的并且是时间不变计算的结果,则不要存储它们,但是在需要时重新计算。

在任何情况下,你采取更少的记忆将更难回答(这是一个物理原理,与编程无关,但与信息理论有关)

答案 2 :(得分:0)

你还没有说过你是否需要按未排序的顺序维护元素 - 我假设没有....

  

如果数据结构已包含该特定值,则必须退出该函数。

你有大约40亿个可能的32位值,而你正在谈论一些看似“少”的数字。对我来说,这表明这样的事情:

vector<uint16_t> bucket[65536];

对于Q百万元素,你平均每个桶有15 * Q个元素......足以使std::vector<>的开销只占内存使用的一小部分,而且很少有足够的速度可以快速恢复 - 添加后排序一个桶或 - 或者 - 进行线性搜索。

如果您认为K会更大,请使用更多的桶来覆盖较小的值范围。如果您不太确定,可能需要一些动态调整,或者完全找到不同的方法。如果K接近128,您可能希望使用bitset作为整个事物。

给定v的逻辑值,您可以使用屏蔽高位(例如(uint32_t)v >> 16)的组合来识别存储桶,使用二进制搜索或插入例如在桶内v & 65535 ....