-1

我必须进入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。但是如何在坚持内容的情况下进行练习。

EDIT x2 问题已解决

4

2 回答 2

7

你不能。Java 数组最多可以有元素 2^31 - 1,因为size数组的 必须适合带符号的 32 位整数。

这适用于您在 32 位或 64 位 JVM 上运行。


我怀疑你在作业中遗漏了一些东西。是否要求能够找到所有素数小于2^32或什么?如果是这种情况,他们希望您将每int一个int[]视为 32 位数组。你需要一个只有2^25整数的数组才能做到这一点......如果我的算术是正确的。

ABitSet是另一个不错的选择。

ALinkedList<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,非素数的素数必须小于或等于其平方根。)

听起来您正在尝试筛选比您需要的更多的数字。

于 2011-10-11T14:22:36.687 回答
2

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

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

于 2011-10-11T14:28:38.977 回答