Временная сложность алгоритма Сито Эратосфена

Из Википедия:

Сложность алгоритма 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). Согласны ли вы?

Ответ 1

  • Ваш 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) в целом, amortized - вы продвигаетесь вперед чтобы найти следующее число только 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).

Ответ 2

Что сложность включает термин loglogn, говорит мне, что где-то есть sqrt (n).

Имейте в виду, что когда вы находите простое число P при просеивании, вы не начинаете перебирать числа в своей текущей позиции + P; вы фактически начинаете перебирать числа в P^2. Все кратные P меньше P^2 будут скрещены предыдущими простыми числами.

Ответ 3

  • Внутренний цикл выполняет шаги 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)):

    void isprime(int n)
    {
        int prime[n],i,j,count1=0;
        for(i=0;i<n;i++)
        {
           prime[i]=1;
        }
        prime[0]=prime[1]=0;
        for(i=2;i<=n;i++)
        {
            if(prime[i]==1)
            {
                printf("%d ",i);
                for(j=2;(i*j)<=n;j++)
                    prime[i*j]=0;
            }
        }    
    }
    

Ответ 4

см. приведенное выше объяснение, внутренний цикл является гармонической суммой всех простых чисел вплоть до sqrt (n). Таким образом, фактическая сложность - это O (sqrt (n) * log (log (sqrt (n))))