【问题标题】:How to get table size 2^32 in java如何在java中获得表大小2 ^ 32
【发布时间】:2011-10-11 14:17:09
【问题描述】:

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

我得到的最大筛子是 2^26,我需要 2^32 来完成我的作业。我尝试使用掩码,但我需要 SIEVE[n] = k where min{k: k|n & k >2}。

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

EDIT x2 问题已解决

【问题讨论】:

  • 您真正需要做什么?分配一个巨大的数组并不是正确的方法。
  • 只有整数会占用 16 GB,所以给自己买一个高端服务器。
  • 我认为你不应该为你的家庭作业做这个。

标签: java arrays sieve-of-eratosthenes


【解决方案1】:

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

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


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

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

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

【讨论】:

  • 我需要使用 Sieve 找到从 2 到 2^63-1 的因子数,并且 sieve 必须具有 P[n]= 是除数为 n 的最小素数的信息。我知道用筛子我可以将数字分解为 2^52。但是如何在坚持内容的情况下进行练习。
【解决方案2】:

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

但是,如果您需要在内存中存储 16GB 的数据,那么您的算法就会存在根本性缺陷。 如果您谈论的是埃拉托色尼筛法,并且您需要将所有 java.util.BitSet 来查找素数,然后根据需要迭代并打印或将它们存储在 LinkedList 中。

【讨论】:

  • LinkedList 在 RAM 和性能方面的效率远低于数组。
  • 我只是给出了解决他的问题的方法,而不管后果如何。有用。然而,我通过指出他的方法中可能存在的缺陷来限定我的答案。
  • 是的,我完全同意你所说的,并且我也了解了它对性能的影响。同样,我给出的答案不是一个干净的答案,只是对他“有用”的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 2017-01-08
  • 1970-01-01
  • 2018-03-07
  • 2011-05-12
  • 1970-01-01
  • 2015-01-13
相关资源
最近更新 更多