Zeitliche Komplexität des Sieb of Eratosthenes-Algorithmus

95

Aus Wikipedia:

Die Komplexität des Algorithmus sind O(n(logn)(loglogn))Bitoperationen.

Wie kommst du dazu?

Dass die Komplexität den loglognBegriff enthält, sagt mir, dass es sqrt(n)irgendwo einen gibt.


Angenommen, ich lasse das Sieb auf den ersten 100 Zahlen ( n = 100) laufen , vorausgesetzt, dass das Markieren der Zahlen als zusammengesetzt eine konstante Zeit mark_composite()in Anspruch nimmt (Array-Implementierung). Die Häufigkeit, mit der wir sie verwenden, wäre ungefähr so

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

Und um die nächste Primzahl zu finden (zum Beispiel, um zu springen, 7nachdem alle Zahlen, die Vielfache von sind 5, durchgestrichen sind ), wäre die Anzahl der Operationen O(n).

Die Komplexität wäre also O(n^3). Sind Sie einverstanden?

Laser
quelle
5
Ich weiß nichts über den Rest (zu mathematisch für mein zu schläfriges Gehirn im Moment), aber die Quadratwurzel ergibt sich aus der Tatsache, dass eine Zahl, wenn sie keine Teiler weniger als ihre Quadratwurzel hat, eine Primzahl ist. Außerdem habe ich gerade erfahren, dass loglog (n) bedeutet, dass es eine Quadratwurzel gibt. Nett.
R. Martinho Fernandes
13
Wie bedeutet das Loglog (n), dass irgendwo ein sqrt (n) ist? (@Martinho: Warum sagst du, du hast das gerade gelernt?) Die eigentliche Analyse beinhaltet keine Quadratwurzeln!
ShreevatsaR

Antworten:

117
  1. Ihr n / 2 + n / 3 + n / 5 +… n / 97 ist nicht O (n), da die Anzahl der Terme nicht konstant ist. [Nach der Bearbeitung bearbeiten: O (n 2 ) ist eine zu lose Obergrenze.] Eine lose Obergrenze ist n (1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6 +…). 1 / n) (Summe der Kehrwerte aller Zahlen bis n), also O (n log n): siehe Harmonische Zahl . Eine korrektere Obergrenze ist n (1/2 + 1/3 + 1/5 + 1/7 +…), dh die Summe der Kehrwerte von Primzahlen bis zu n, also O (n log log n). (Siehe hier oder hier .)

  2. Das Bit "Finde die nächste Primzahl" ist insgesamt nur O (n), amortisiert - Sie werden fortfahren, um die nächste Zahl nur n Mal in zu finden insgesamt , nicht pro Schritt. Dieser ganze Teil des Algorithmus benötigt also nur O (n).

Wenn Sie diese beiden verwenden, erhalten Sie eine Obergrenze von O (n log log n) + O (n) = O (n log log n) arithmetischen Operationen. Wenn Sie Bitoperationen zählen, haben sie, da es sich um Zahlen bis zu n handelt, ungefähr log n Bits. Hier kommt der Faktor log n ins Spiel, was O (n log n log log n) Bitoperationen ergibt.

ShreevatsaR
quelle
Für einen Teil des Problems betrachten Sie die asymptotische Komplexität. Für den anderen Teil erwägen Sie eine amortisierte Komplexität. Ich bin verwirrt.
Crisron
2
@crisron Was ist das Problem? Es ist nicht so, dass "asymptotische Komplexität" und "amortisierte Komplexität" zwei verschiedene Arten derselben Sache sind. Die Amortisation ist nur eine Technik, um etwas genauer zu zählen, was zufällig die asymptotische Komplexität sein kann.
ShreevatsaR
Während ich sie immer als anders betrachtete. Vielen Dank für die Klarstellung.
Crisron
1
@ShreevatsaR Warum berechnen wir die Summe der harmonischen Reihen bis zu n Termen? Sollten wir nicht nur bis zu sqrt (n) Terme berechnen? Geben Sie die Antwort als Theta von n (loglogsqrt (n)) arithmetischen Operationen? Wikipedia sagt auch, dass die Raumkomplexität O (n) ist. Sollte das nicht Theta von n sein, weil wir auf jeden Fall ein Array von n Elementen benötigen?
a_123
@ s_123 Ja, Sie können nur bis zu √n Terme berechnen, aber es macht keinen Unterschied in der asymptotischen Analyse (oder sogar einen signifikanten praktischen Unterschied in der Laufzeit), weil log (√x) = (1/2) log x für jedes x. Also ist Θ (n log log √n) = Θ (n log log n). Zu Ihrer anderen Frage: Ja, die Raumkomplexität ist Θ (n), was auch O (n) ist: Es ist üblich, O () zu verwenden, um anzuzeigen, dass Sie die Obergrenze angeben, anstatt Θ () zu sagen, um anzuzeigen dass es auch die Untergrenze ist (besonders wenn die Untergrenze offensichtlich ist, wie es hier ist).
ShreevatsaR
7

Dass die Komplexität den loglogn-Begriff enthält, sagt mir, dass es irgendwo ein sqrt (n) gibt.

Denken Sie daran, dass Sie, wenn Sie Pbeim Sieben eine Primzahl finden , an Ihrer aktuellen Position keine Zahlen kreuzen + P; Sie fangen tatsächlich an, Zahlen bei zu kreuzen P^2. Alle Vielfachen von Pweniger als P^2werden durch frühere Primzahlen durchgestrichen worden sein.

jemfinch
quelle
10
Diese Aussage ist an sich wahr, hat aber keinen Einfluss auf die zitierte Aussage, die selbst keinen Wert hat. Unabhängig davon, ob wir von poder ausgehen p^2, ist die Komplexität gleich (mit Direktzugriffs-Arrays).SUM (1/p) {p<N} ~ log (log N)ist der Grund.
Will Ness
6
  1. Die innere Schleife führt n/iSchritte aus, wobei iprime => die gesamte Komplexität ist sum(n/i) = n * sum(1/i). Gemäß der Prime Harmonic-Reihe ist das sum (1/i)Wo iist Prime log (log n). Insgesamt,O(n*log(log n)) .
  2. Ich denke, die obere Schleife kann durch Ersetzen optimiert werden n mit sqrt(n)so Gesamtzeitkomplexität wird 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
quelle
2
Nein, wenn Sie n durch sqrt (n) ersetzen, wird ~ n log log (sqrt n) erstellt, das immer noch ~ n log log n ist. und isprimeist absolut der falsche Name, um dort zu verwenden.
Will Ness
-1

siehe obige Erklärung die innere Schleife ist die harmonische Summe aller Primzahlen bis sqrt (n). Die tatsächliche Komplexität von ist also O (sqrt (n) * log (log (sqrt (n))))

Bharath Kumar Reddy Appareddy
quelle
2
falsch. wir markieren den ganzen Weg bis zum N: N / 2 + N / 3 + N / 5 + N / 7 + N / 11 + ... = N (1/2 + 1/3 + 1/5 + 1/7 + 1/11 + ...) ~ N Protokollprotokoll (sqrt N) ~ N Protokollprotokoll N.
Will Ness