Complexité temporelle de l'algorithme Sieve of Eratosthenes

95

De Wikipedia:

La complexité de l'algorithme réside dans O(n(logn)(loglogn))les opérations sur les bits.

Comment y arrivez-vous?

Que la complexité inclut le loglognterme me dit qu'il y a un sqrt(n)quelque part.


Supposons que j'exécute le tamis sur les 100 premiers nombres ( n = 100), en supposant que le marquage des nombres comme composites prend un temps constant (implémentation du tableau), le nombre de fois que nous utilisons mark_composite()serait quelque chose comme

n/2 + n/3 + n/5 + n/7 + ... + n/97        =      O(n^2)                         

Et pour trouver le prochain nombre premier (par exemple pour sauter après 7avoir barré tous les nombres multiples de 5), le nombre d'opérations serait O(n).

Donc, la complexité serait O(n^3). Êtes-vous d'accord?

Lazer
la source
5
Je ne sais pas pour le reste (trop mathématique pour mon cerveau trop endormi en ce moment), mais la racine carrée vient du fait que si un nombre n'a pas de diviseurs de moins que sa racine carrée, il est premier. De plus, je viens d'apprendre que loglog (n) signifie qu'il y a une racine carrée. Agréable.
R. Martinho Fernandes
13
Comment le loglog (n) étant là signifie-t-il qu'il y a un sqrt (n) quelque part? (@Martinho: Pourquoi dites-vous que vous "venez d'apprendre cela"?) L'analyse proprement dite n'implique aucune racine carrée!
ShreevatsaR

Réponses:

117
  1. Votre n / 2 + n / 3 + n / 5 +… n / 97 n'est pas O (n), car le nombre de termes n'est pas constant. [Modifier après votre modification: O (n 2 ) est une limite supérieure trop lâche.] Une limite supérieure lâche est n (1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6 +… 1 / n) (somme des réciproques de tous les nombres jusqu'à n), qui est O (n log n): voir nombre harmonique . Une borne supérieure plus correcte est n (1/2 + 1/3 + 1/5 + 1/7 +…), c'est-à-dire la somme des réciproques de nombres premiers jusqu'à n, qui est O (n log log n). (Voir ici ou ici .)

  2. Le bit "trouver le prochain nombre premier" est seulement O (n) globalement, amorti - vous irez de l'avant pour trouver le nombre suivant seulement n fois au total , pas par pas. Donc, toute cette partie de l'algorithme ne prend que O (n).

Donc, en utilisant ces deux, vous obtenez une limite supérieure d'opérations arithmétiques O (n log log n) + O (n) = O (n log log n). Si vous comptez les opérations sur bits, puisque vous avez affaire à des nombres allant jusqu'à n, ils ont environ log n bits, c'est là que le facteur de log n entre en jeu, donnant O (n log n log log n) opérations sur bits.

ShreevatsaR
la source
Pour une partie du problème, vous considérez la complexité asymptotique. Pour l'autre partie, vous considérez la compexité amortie. Je suis confus.
crisron
2
@crisron Quel est le problème? Il n'est pas vrai que la «complexité asymptotique» et la «complexité amortie» sont deux types différents de la même chose. L'amortissement est juste une technique pour compter plus soigneusement quelque chose, ce qui peut être la complexité asymptotique.
ShreevatsaR
Tout cela pendant que je les considérais comme différents. Merci d'avoir clarifié cela.
crisron
1
@ShreevatsaR Pourquoi calculons-nous la somme des séries harmoniques jusqu'à n termes. Ne devrions-nous pas calculer jusqu'à des termes sqrt (n)? Donner la réponse comme thêta de n (loglogsqrt (n)) opérations arithmétiques? En outre, wikipedia dit que la complexité de l'espace est O (n). Cela ne devrait-il pas être thêta de n parce que nous avons besoin d'un tableau de n éléments dans tous les cas?
a_123
@ s_123 Oui, vous pouvez calculer jusqu'à √n termes, mais cela ne fait aucune différence dans l'analyse asymptotique (ni même une différence pratique significative dans le temps d'exécution), car log (√x) = (1/2) log x pour tout x. Donc Θ (n log log √n) = Θ (n log log n). Pour votre autre question, oui, la complexité spatiale est Θ (n), qui est aussi O (n): il est conventionnel d'utiliser O () pour indiquer que vous spécifiez la borne supérieure, au lieu de dire Θ () pour indiquer que c'est aussi la borne inférieure (surtout lorsque la borne inférieure est évidente, comme c'est le cas ici).
ShreevatsaR
7

Le fait que la complexité inclut le terme loglogn me dit qu'il y a un sqrt (n) quelque part.

Gardez à l'esprit que lorsque vous trouvez un nombre premier Ppendant le tamisage, vous ne commencez pas à rayer les nombres à votre position actuelle + P; vous commencez en fait à rayer des chiffres à P^2. Tous les multiples de Pmoins que P^2auront été barrés par les nombres premiers précédents.

jemfinch
la source
10
cette affirmation est vraie en soi, mais n'a aucun rapport avec la déclaration citée qui elle-même n'a aucun mérite. Que nous partions de pou p^2, la complexité est la même (avec des tableaux d'accès direct). SUM (1/p) {p<N} ~ log (log N)est la raison.
Will Ness
6
  1. La boucle interne fait des n/iétapes, où iest prime => toute la complexité est sum(n/i) = n * sum(1/i). Selon les séries harmoniques principales, sum (1/i)iest premier est log (log n). Au total, O(n*log(log n)).
  2. Je pense que la boucle supérieure peut être optimisée en la remplaçant npar sqrt(n)une complexité temporelle globale 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;
            }
        }    
    }
    
Anand Tripathi
la source
2
non, remplacer n par sqrt (n) en fait ~ n log log (sqrt n) qui est toujours ~ n log log n. et isprimec'est absolument le mauvais nom à utiliser ici.
Will Ness
-1

voir l'explication ci-dessus la boucle interne est la somme harmonique de tous les nombres premiers jusqu'à sqrt (n). Ainsi, la complexité réelle de est O (sqrt (n) * log (log (sqrt (n))))

Bharath Kumar Reddy Appareddy
la source
2
faux. nous marquons jusqu'au N: N / 2 + N / 3 + N / 5 + N / 7 + N / 11 + ... = N (1/2 + 1/3 + 1/5 + 1/7 + 1/11 + ...) ~ N log log (sqrt N) ~ N log log N.
Will Ness