我有一个信息检索应用程序,它创建数以千万计的位数组。数组中“设置”位的数量变化很大,从全部清除到全部设置。目前,我使用的是直截了当的位数组 ( java.util.BitSet
),所以我的每个位数组都需要几兆字节。
我的计划是查看前N位的基数,然后决定其余部分使用什么数据结构。显然,一些数据结构更适合非常稀疏的位数组,而另一些数据结构在设置了大约一半的位时更好(当设置了大多数位时,我可以使用否定将其视为一组稀疏的零)。
- 什么结构可能在每个极端都有好处?
- 中间有吗?
以下是一些限制或提示:
- 这些位仅设置一次,并且按索引顺序设置。
- 我需要 100% 的准确率,所以像布隆过滤器这样的东西还不够好。
- 建立集合后,我需要能够有效地迭代“集合”位。
- 这些位是随机分布的,因此游程编码算法不太可能比一个简单的位索引列表好多少。
- 我正在尝试优化内存利用率,但速度仍然很重要。
具有开源 Java 实现的东西是有帮助的,但不是绝对必要的。我对基础知识更感兴趣。