Java 如何创建大于最大整数的数组

Java 如何创建大于最大整数的数组,java,algorithm,data-structures,Java,Algorithm,Data Structures,我试图得到600851475143之前的所有素数。 我用的是埃拉托什尼筛。 这需要我创建一个如此巨大的布尔数组。 坏主意,你可能会耗尽内存。 任何其他方式。我尝试使用字符串,使用值为0和1的每个索引来表示true或false。但indexOf方法也返回int 接下来,我将使用2d数组解决我的问题。 还有其他更好的方法来存储这么大的数组吗?使用。然后可以设置任何索引元素的位。600851475143是2^39,因此在内部仅占用39位(实际上,由于它使用的长度较长,它将占用64位) 实际上,您可以移

我试图得到600851475143之前的所有素数。 我用的是埃拉托什尼筛。 这需要我创建一个如此巨大的布尔数组。 坏主意,你可能会耗尽内存。 任何其他方式。我尝试使用字符串,使用值为0和1的每个索引来表示true或false。但indexOf方法也返回int

接下来,我将使用2d数组解决我的问题。 还有其他更好的方法来存储这么大的数组吗?

使用。然后可以设置任何索引元素的位。600851475143是
2^39
,因此在内部仅占用39位(实际上,由于它使用的长度较长,它将占用64位)


实际上,您可以移动到
2^63
,这在大多数情况下都是巨大的

我有一个类似的问题,我使用了一个位集(基本上按顺序将所需偏移量设置为1或0),我建议使用它也会压缩您的位集

编辑


正如Alan所说,位集将占用70GB的内存,但您可以做另一件事:拥有多个位集(连续的位集,以便您可以计算绝对位置)并在内存中加载您当时需要的位集,比如延迟加载,在这种情况下,您可以控制所使用的内存。

600851475143布尔型的内存需求最多为70Gb。这是不可行的。您需要按照Stephan的建议使用压缩,或者找到一种不同的算法来计算素数。

记住每个数字是否是素数对于如此大的数量并不实际(一般来说,对于大的数字,筛子是一种非常缓慢的方法)

从这里你可以知道有多少个素数会小于X。对于你的6000亿范围,你可以预计大约有200亿个素数会存在于这个范围内。将它们存储为长[]将需要大约160GB的内存。。。这明显超过了建议的为每个数字存储单个位的70GB,如果排除偶数(2是唯一的偶数素数),则为建议值的一半

对于台式计算机来说,35GB内存可能有点大,但一个好的工作站可以有这么多RAM。我会尝试使用位移位/掩蔽的二维数组


我仍然希望您的筛选代码运行相当长的时间(从几天到几年)。我建议您研究比sieve更高级的素检测方法。

您可以使用HotSpot的内部sun.misc.Unsafe API来分配更大的阵列。但是,它不是一个正式的Java API,因此它符合黑客的资格。

“我试图在600851475143之前获取所有素数。”对于Project Euler问题,这是完全错误的方法。我建议,如果您的解决方案需要生成6000亿个数组条目,然后你需要采取一种新的方法。@Ashok向量由数组支持,我看不出这有什么区别。@Ashok向量由数组支持,并且是同步的。不会有帮助。+1:向量无法使用。他需要2^39位,而不是39位。OP需要600851475143位标志(如果跳过偶数,则需要一半,如果跳过3的倍数,则需要三分之一,如果跳过更多小素数的倍数,则需要更少)。在
位集中,这仍然会有更多的条目被编入索引。
@assylias是的,这是可行的,但可能不现实!嗯,我可能应该澄清一下,虽然可能,但对于一台真正高端的计算机(或者可能是超级计算机)来说,这是不可行的(也就是说是不可行的)。我不想使用库,所以即使EWAHCompressedBitmap非常有前景,我也会使用每个大小为32MB的位集。并向其添加延迟加载。寻找更好的选择。解决这个问题的传统方法速度太慢,但确实有效。