繁体   English   中英

如何在Java中获取表大小2 ^ 32

[英]How to get table size 2^32 in java

我必须进入java protected final static int [] SIEVE = new int [ 1 << 32 ]; 但是我不能强迫Java这么做。

我得到的最大筛子是2 ^ 26我需要2 ^ 32才能结束作业。 我尝试使用遮罩,但是我需要SIEVE [n] = k,其中min {k:k | n&k> 2}。

编辑我需要使用Sieve查找2到2 ^ 63-1的因数,并且sieve必须具有P [n] =是除以n的最小素数的信息。 我知道用筛子可以将因子分解为2 ^ 52。 但是,如何坚持内容呢?

编辑x2问题已解决

你不能 一个Java阵列可以具有至多 2^31 - 1元件,因为size的阵列具有适合在一个符号的32位整数。

无论您是在32位还是64位JVM上运行,这都适用。


我怀疑您的作业中缺少一些东西。 是否要求能够找到所有小于2^32素数? 如果是这种情况,他们希望您将int[]每个int视为32位数组。 如果我的算术是正确的,则只需要一个2^25 int的数组即可。

BitSet是另一个不错的选择。

LinkedList<Integer>是一个较差的选择。 它使用的内存大约是相同大小的数组的8倍,并且对于长列表来说, get(int)的性能将非常慢……假设您以明显的方式使用它。

如果您想要某种可以有效使用尽可能多的内存(可以配置JVM来使用)的内存,则应使用int[][]即整数数组的数组,并且int[]实例应尽可能大使他们。


我需要使用Sieve查找从2到2 ^ 63-1的因数,并且sieve必须具有P [n] =是除以n的最小素数的信息。 我知道用筛子可以将因子分解为2 ^ 52。 但是,如何坚持内容呢?

我不确定我是否了解您。 要分解2 ^ 64范围内的数字,您只需要质数最大为2 ^ 32 ...而不是2 ^ 52。 (2 ^ 64的平方根为2 ^ 32,并且非素数必须具有小于或等于其平方根的素数。)

听起来您正在尝试筛除所需的更多数字。

如果确实需要在内存中存储那么多数据,请尝试使用java.util.LinkedList集合。

但是,如果您需要在内存中存储16GB数据,则算法中存在一个基本缺陷。 如果您正在谈论Eratosthenes的筛网,并且您需要将所有<2 ^ 32的素数存储在一个数组中,那么您仍然不需要大小为2 ^ 32的数组。 我建议您使用java.util.BitSet查找素数,然后根据需要迭代并打印或将其存储在LinkedList中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM