Aus Wikipedia:
Die Komplexität des Algorithmus sind
O(n(logn)(loglogn))
Bitoperationen.
Wie kommst du dazu?
Dass die Komplexität den loglogn
Begriff 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, 7
nachdem 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?
Antworten:
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 .)
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.
quelle
Denken Sie daran, dass Sie, wenn Sie
P
beim Sieben eine Primzahl finden , an Ihrer aktuellen Position keine Zahlen kreuzen +P
; Sie fangen tatsächlich an, Zahlen bei zu kreuzenP^2
. Alle Vielfachen vonP
weniger alsP^2
werden durch frühere Primzahlen durchgestrichen worden sein.quelle
p
oder ausgehenp^2
, ist die Komplexität gleich (mit Direktzugriffs-Arrays).SUM (1/p) {p<N} ~ log (log N)
ist der Grund.n/i
Schritte aus, wobeii
prime => die gesamte Komplexität istsum(n/i) = n * sum(1/i)
. Gemäß der Prime Harmonic-Reihe ist dassum (1/i)
Woi
ist Primelog (log n)
. Insgesamt,O(n*log(log n))
.Ich denke, die obere Schleife kann durch Ersetzen optimiert werden
n
mitsqrt(n)
so Gesamtzeitkomplexität wirdO(sqrt(n)loglog(n))
:quelle
isprime
ist absolut der falsche Name, um dort zu verwenden.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))))
quelle