当我尝试使用Java创建一个非常大的布尔数组时,例如:
boolean[] isPrime1 = new boolean[600851475144];
我可能会丢失精度错误?
太大了吗?
答案 0 :(得分:16)
要存储600 十亿位,您需要一个绝对最小的地址空间为75 千兆字节!祝你好运!
更糟糕的是,Java规范没有规定boolean
数组会为每个元素使用一位内存 - 它可以(and in some cases does)使用更多。
无论如何,我从Project Euler #3识别出这个号码。如果它需要那么多记忆,那你做错了......
答案 1 :(得分:4)
考虑使用BitSet。
答案 2 :(得分:4)
由于你试图以错误的方式解决欧拉问题#3,这里有一个提示:你应该找到一个数字的所有主要因子,而不是所有的素数数字低于某个限制。
BTW:这个特殊的欧拉问题可以用很少的RAM来解决。答案 3 :(得分:3)
数组索引是一个int,而不是long,所以你的“数组”太大而不适合数组。 其中一个java Collection类可能更适合。没关系 - Collection.size()也返回一个int,因此Collection也不能存储超过Integer.MAX_VALUE
项。
答案 4 :(得分:2)
答案 5 :(得分:2)
您可以使用一个long数组,封装在一个可以处理数组上所有操作的类中。像你自己的BitSet实现一样。
答案 6 :(得分:2)
问题是你使用长值而不是数组大小的int值。 Java不支持比int的最大值更长的数组长度。 Java将长度视为long,因为您指定的大小超过了int的最大值但是在long中。因此,它必须将长度转换回int以创建数组。从长转换 - > int正在产生你看到的警告
答案 7 :(得分:1)
为什么不将值存储在文件中,然后搜索文件中的位置并提取正确的值。像其他人所说,这是70GB的数据。在大多数情况下,您甚至无法将其保留在内存中。如果您要将它存储到文件中,您甚至可以在使用按位运算符存储和检索数据时查看单个位,以节省存储空间。
此外,由于素数的数量随着数字的大小而减少,所以最好将质数本身按顺序存储在文件中,然后对数字进行二进制搜索以查看它是否为1素数。
答案 8 :(得分:1)
你在数组中有什么价值? 对于如此大的数字,我猜它将是一个稀疏数组,所以也许最好使用Map / List并且只是分配空间并为一个值存储一个值。或者,如果您的大多数值为1,则为0。
答案 9 :(得分:1)
Apache ActiveMQ有一个名为BitArrayBin的数据结构。这用于确定消息是否重复。消息ID是生产者ID和序列ID的组合。 每个生产者都有一个BitArrayBin来跟踪它的序列ID。一旦找到给定生成器的BitArrayBin,它就会将序列ID设置为BitArrayBin的长值。
oldValue = bitArrayBin.setBit(sequenceId, true)
if (oldVlaue) {
"message is duplicated"
}
该方法返回旧值。
如果y是长索引,则它用于导出bin索引和偏移量。
y = bin index * 64 + offset
BitArrayBin只不过是许多箱子的支架,其大小可以在构造过程中定义。每个bin包含一个long变量来存储这些位,因此它可以存储多达64个布尔值。
位掩码用于设置该位,然后获取它的值。
这个类没有太多文档。你需要通过它的源代码来了解内部。