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