【问题标题】:can java.util.BitSet hold more than MAX_INT no. of bits?java.util.BitSet 可以容纳超过 MAX_INT 否。位?
【发布时间】:2013-12-26 20:49:17
【问题描述】:

由于BitSet.get() 函数使用int 作为参数,我在想是否可以在BitSet 中存储超过2^32 位,如果可以,我将如何检索它们?

我正在做一个 Project Euler 问题,我需要生成素数直到 10^10。我目前用来生成素数的算法是 Erathonesus' Sieve,将布尔值作为位存储在 BitSet 中。有什么解决方法吗?

【问题讨论】:

  • 尝试将BigInteger 与“BigInteger.nextProbablePrime”一起使用。对我来说,它以我期望的方式工作。
  • Eratosthenes 的筛子不适用于寻找大素数。我会推荐一种不同的方法。维基百科的条目推荐使用伪正方形素筛。

标签: java bitset


【解决方案1】:

您可以使用位集列表作为List<BitSet>,当到达一个位集的末尾时,您可以移动到下一个。

但是,我认为您的方法可能不正确。即使您为每个数字使用单个位,您也需要 10^10 位,这大约是 1 GB 内存(一个字节为 8 位,一个 GB 为 1024^3 字节)。大多数 Project Euler 问题应该可以在不需要那么多内存的情况下解决。

【讨论】:

  • 我正在做“Primes With Runs”问题,不。 111. 我可能需要一个更好的素数发生器。无论如何,谢谢。
【解决方案2】:

不,它受其接口中的 int 索引的限制。 所以他们没有费心去挖掘它的所有潜力,(大约缩小了 64 倍)可能是因为使用那么多 RAM 是不可行的。 我参与了LongBitSet 的实现,published it here

可能需要:

//2,147,483,647 For reference, this is Integer.MAX_VALUE
137,438,953,216 LongBitSet max size (bits)
0b1111111_11111111_11111111_11111100_000000L in binary

必须解决极端情况,在提交历史记录中,您可以看到第一次提交是来自java.util.BitSet 的复制粘贴。

查看工厂方法:

    public static LongBitSet getMaxSizeInstance() {
        // Integer.MAX_VALUE - 3 << ADDRESS_BITS_PER_WORD
        return new LongBitSet( 0b1111111_11111111_11111111_11111100_000000L);
    }

注意:-Xmx24G -Xms24G -ea 启动 JVM 需要最小 GB 才能调用 getMaxSizeInstance() 而没有 java.lang.OutOfMemoryError: Java heap space

【讨论】:

    猜你喜欢
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    相关资源
    最近更新 更多