Я работаю по методу в Java, который создает логическое массив IsPrime:Оптимизировать скорость премьер номер Сито (Java)
boolean[] isPrime;
, в которых простые числа помечены «истина» и остальные с 'ложный'.
Пока я на него, я бы также хотел бы подсчитать количество Primes найдено:
int numPrimesFound;
Основная идея заключается в том, чтобы использовать Решето Эратосфена. До сих пор мой метод выглядит следующим образом:
public Sieve(final int limit) {
long startTime = System.currentTimeMillis();
boolean[] isPrime = new boolean[limit];
this.isPrime = isPrime;
for (int i=3; i<=limit ;i+=2) {
isPrime[i] = true; //sets all even numbers to true
}
isPrime[2] = true;
numPrimesFound = 1; //special case of '2'
for (int i = 3; i * i <= limit; i += 2) {
if (isPrime[i] == true) {
for (int j = i; i * j <= limit; j += 2) {
isPrime[i * j] = false; //has a multiple ==> not a prime
numPrimesFound++; //doesn't work yet
}
}
}
long stopTime = System.currentTimeMillis(); //measuring execution time
System.out.println("Sieve: " + (stopTime - startTime) + " milliseconds.")
}
Так что моя проблема в том, что
numPrimesFound++:
не работает, так как решето устанавливает значение некоторых не простых чисел к «ложным» более чем один раз (например, 45 bcs 3 * 15 = 45 и 9 * 5 = 45).
Значит, кто-нибудь знает, как я могу переписать эту программу, чтобы все лишние числа задавали «false» только один раз?
Или, вообще говоря, может ли кто-нибудь предложить способы ускорения метода?
Какой результат вы интересуете: количество простых чисел или самих простых чисел? Как вы видели, 'numPrimesFound' ошибочен, но это не связано со скоростью алгоритма, который находит простые числа. Также: вы должны, вероятно, прочитать [Как написать правильный микропредмет в Java] (http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java). –
избавиться от умножений во внутреннем цикле, оставить там только добавления: 'i * (j + 2) == i * j + 2 * i'. –