Как получить размер таблицы 2 ^ 32 в Java - PullRequest
0 голосов
/ 11 октября 2011

Я должен войти в Java protected final static int [] SIEVE = new int [ 1 << 32 ]; Но я не могу заставить Джаву к этому.

Максимальное сито: 2 ^ 26 Мне нужно 2 ^ 32, чтобы закончить домашнее задание.Я пытался с маской, но мне нужно иметь SIEVE [n] = k, где min {k: k | n & k> 2}.

РЕДАКТИРОВАТЬ Мне нужно найти номера факторов от 2 до 2 ^ 63-1использование сита и сита должно иметь информацию о том, что P [n] = наименьшее простое число с делением n.Я знаю, что с ситом я могу вывести число до 2 ^ 52.Но как это работает с удержанием контента.

РЕДАКТИРОВАТЬ x2 проблема решена

Ответы [ 2 ]

7 голосов
/ 11 октября 2011

Вы не можете. Массив Java может содержать не более 2^31 - 1 элементов, поскольку size массива должен помещаться в 32-разрядное целое число со знаком.

Это применимо, работаете ли вы на 32-битной или 64-битной JVM.


Я подозреваю, что вы что-то упустили в своей домашней работе. Требуется ли найти все простые числа меньше 2^32 или что-то еще? Если это так, они ожидают, что вы будете обрабатывать каждый int из int[] как массив из 32 битов. И для этого нужен массив всего 2^25 целых ... если моя арифметика верна.

A BitSet - еще одна хорошая альтернатива.

A LinkedList<Integer> - плохая альтернатива. Он использует примерно в 8 раз больше памяти, чем массив того же размера, и производительность get(int) будет ужасно медленной для длинного списка ... при условии, что вы используете его очевидным образом.

Если вы хотите что-то, что может эффективно использовать столько памяти, сколько вы можете сконфигурировать для своей JVM, то вы должны использовать int[][], то есть массив массивов целых чисел, с экземплярами int[], равными вашему размеру. могу сделать их.


Мне нужно найти номера факторов от 2 до 2 ^ 63-1, используя сито, и сито должно иметь информацию о том, что P [n] = наименьшее простое число с делением n. Я знаю, что с ситом я могу вывести число до 2 ^ 52. Но как это делать, держась за содержание?

Я не совсем уверен, что понимаю вас. Чтобы разложить число в области 2 ^ 64, вам нужно только простые числа до 2 ^ 32 ... не 2 ^ 52. (Корень квадратный из 2 ^ 64 равен 2 ^ 32, и непростое число должно иметь простой множитель, который меньше или равен его квадратному корню.)

Звучит так, будто вы пытаетесь просеять больше чисел, чем нужно.

2 голосов
/ 11 октября 2011

Если вам действительно нужно хранить столько данных в памяти, попробуйте использовать коллекцию java.util.LinkedList.

Однако в вашем алгоритме есть существенный недостаток, если вам нужно хранить 16 ГБ данных в памяти. Если вы говорите о Sieve of Eratosthenes и вам нужно хранить все простые числа <2 ^ 32 в массиве, вам все равно не понадобится массив размером 2 ^ 32. Я бы посоветовал вам использовать <code>java.util.BitSet для поиска простых чисел и итерировать и распечатывать или сохранять их в LinkedList, как требуется.

...