Из Википедии:
Сложность алгоритма -
O(n(logn)(loglogn))
битовые операции.
Как вы к этому пришли?
То, что loglogn
термин включает сложность, говорит мне, что sqrt(n)
где-то есть.
Предположим, я использую решето для первых 100 чисел ( n = 100
), предполагая, что маркировка чисел как составных занимает постоянное время (реализация массива), количество использованных нами раз mark_composite()
будет примерно таким, как
n/2 + n/3 + n/5 + n/7 + ... + n/97 = O(n^2)
А чтобы найти следующее простое число (например, чтобы перейти к нему 7
после вычеркивания всех чисел, кратных ему 5
), количество операций будет O(n)
.
Итак, сложность была бы O(n^3)
. Вы согласны?
Ответы:
Ваш n / 2 + n / 3 + n / 5 +… n / 97 не является O (n), потому что количество членов непостоянно. [Отредактируйте после вашего редактирования: O (n 2 ) слишком слабая верхняя граница.] Нечеткая верхняя граница равна n (1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6 +… 1 / n) (сумма обратных значений всех чисел до n), что составляет O (n log n): см. Гармоническое число . Более правильная верхняя граница - это n (1/2 + 1/3 + 1/5 + 1/7 +…), то есть сумма обратных чисел до n, которая равна O (n log log n). (См. Здесь или здесь .)
Бит «найти следующее простое число» составляет всего O (n) в целом, амортизируется - вы будете двигаться вперед, чтобы найти следующее число только n раз в целом , а не за шаг. Таким образом, вся эта часть алгоритма занимает всего O (n).
Таким образом, используя эти два, вы получаете верхнюю границу арифметических операций O (n log log n) + O (n) = O (n log log n). Если вы подсчитываете битовые операции, поскольку вы имеете дело с числами до n, они имеют примерно log n битов, и именно здесь входит коэффициент log n, давая O (n log n log log n) битовых операций.
источник
Имейте в виду, что когда вы находите простое число
P
во время просеивания, вы не начинаете вычеркивать числа в вашей текущей позиции +P
; вы фактически начинаете вычеркивать числа сP^2
. Все числа, кратныеP
меньшемуP^2
, были перечеркнуты предыдущими простыми числами.источник
p
илиp^2
, сложность одинакова (с массивами прямого доступа).SUM (1/p) {p<N} ~ log (log N)
это причина.n/i
шаги, гдеi
простое число => вся сложностьsum(n/i) = n * sum(1/i)
. Согласно ряду простых гармоник,sum (1/i)
гдеi
есть простое числоlog (log n)
. ВсегоO(n*log(log n))
.Я думаю , что верхняя петля может быть оптимизирована путем замены
n
сsqrt(n)
таким общей сложностью времени будетO(sqrt(n)loglog(n))
:источник
isprime
это абсолютно неправильное имя для использования там.см. приведенное выше объяснение, внутренний цикл представляет собой гармоническую сумму всех простых чисел до sqrt (n). Итак, фактическая сложность составляет O (sqrt (n) * log (log (sqrt (n))))
источник