Оригинал: Об одном алгоритме поиска простых чисел
Как-то, ради интереса, я решил поискать в Сети материалы о нахождении всех простых чисел в диапазоне от 1 до N за линейное время. Нашлись некоторые статьи на английском, но описанные алгоритмы были несколько сложны для реализации. К сожалению, поиски на русском не увенчались успехом - были какие-то оптимизации, пытающиеся уменьшить объем памяти, константу в оценке времени, но ничего за O(N), так что я решил восполнить данный пробел.
Определение проблемы
Для начала, вспомним, что существует так называемое решето Эратосфена, позволяющее решать нашу задачу за O(N ln ln N):
bool notPrime[MAXN + 1]; int primes[MAXN]; int sieve(int n) { int primesCount = 0; int sqrt_n = (int)sqrt((double)n); for (int i = 2; i <= n; ++i) { if (!notPrime[i]) { primes[primesCount++] = i; if (i <= sqrt_n) { for (int j = i * i; j <= n; j += i) { notPrime[j] = true; } } } } return primesCount; }
Почему решето работает не за линейное время? Потому что одно число в нем может вычеркиваться несколько раз (во внутреннем цикле) . Если добиться, чтобы каждое число вычеркивалось не более одного раза, то, очевидно, алгоритм будет линейным
Многие студенты, начав участвовать в олимпиадах, задаются вопросом: “Как добиться каких-либо значительных результатов?“. Здесь есть два варианта:
Хочу рассказать об одном интересном и полезном, с моей точки зрения, для общего развития применении таких базовых структур данных, как
Долгое время ACM ICPC был единственным крупномасштабным официальным соревнованием. Однако несколько лет назад ситуация изменилась: ежегодно стал проводиться
Международная олимпиада по информатике (International Olympiad in Informatics, IOI) - самое известное соревнование среди школьников.


Последние комментарии
5 недели 2 дня назад
15 недели 5 дня назад
16 недели 1 день назад
30 недели 10 часа назад
31 недели 23 часа назад
33 недели 3 дня назад
35 недели 14 часа назад
35 недели 1 день назад
35 недели 4 дня назад
37 недели 2 дня назад