在java中,一个数组最多可以包含Integer.MAX_VALUE项,因为它使用整数作为数组的键。 当我想使用long作为索引时,最好使用的对象是什么?
例如,如果我想使用主筛计算低于50亿的所有素数,我就不能使用数组,因为5000000000太大而无法存储在整数中。
答案 0 :(得分:8)
500万个元素的筛子不需要5,000,000,000个值的数组;它需要5,000,000,000 位。不幸的是,BitSet
也使用int
索引,但您可以通过分配5000000000 / 32
整数来实现自己的位集,然后使用位操作来访问相应的位:
long
作为实际位置pos
int
数组中int
的位置为(int)(pos / 32)
int
内的位位置为(int)(pos % 32)
另一种方法是切换到分段筛,这会将内存需求减少到√N。 here给出了对其工作原理的一个很好的解释。