Может java.util.BitSet содержать больше, чем MAX_INT нет. бит?
Как BitSet.get()
функция использует int
в качестве аргумента я думал, смогу ли я хранить более 2^32 бит в BitSet
и если да, то как бы я их получить?
Я делаю задачу Project Euler, где мне нужно генерировать простые числа до 10^10. Алгоритм, который я в настоящее время использую для генерации простых чисел, - это Erathonesus Sieve, хранящий логические значения в виде битов в BitSet. Любой обходной путь для этого?
2 ответа
Вы можете использовать список битов как List<BitSet>
и когда достигнут конец одного набора битов, вы можете перейти к следующему.
Тем не менее, я думаю, что ваш подход, вероятно, неверен. Даже если вы используете один бит для каждого нужного вам числа 10^10
биты о которых 1 GB
память (8 бит в байте и 1024^3 байта в ГБ). Большинство задач Project Euler должны быть решаемы без необходимости в большом количестве памяти.
Нет, он ограничен индексацией int в своем интерфейсе. Поэтому они не удосужились использовать весь его потенциал (примерно в 64 раза), вероятно, потому, что было невозможно использовать столько оперативной памяти. я работал над
LongBitSet
реализация, опубликована здесь.
Это может занять:
//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
Пришлось решать угловые случаи, в истории коммитов вы можете увидеть, что 1-й коммит является копией вставки из
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 для вызова
getMaxSizeInstance()
без
java.lang.OutOfMemoryError: Java heap space