Dari Wikipedia:
Kompleksitas dari algoritma ini adalah
O(n(logn)(loglogn))
operasi bit.
Bagaimana Anda sampai pada hal itu?
Bahwa kompleksitas termasuk loglogn
istilah memberitahu saya bahwa ada suatu sqrt(n)
tempat.
Misalkan saya menjalankan saringan pada 100 angka pertama ( n = 100
), dengan asumsi bahwa menandai angka sebagai komposit membutuhkan waktu konstan (implementasi array), berapa kali yang kita gunakan mark_composite()
akan menjadi seperti
n/2 + n/3 + n/5 + n/7 + ... + n/97 = O(n^2)
Dan untuk menemukan bilangan prima berikutnya (misalnya melompat ke 7
setelah mencoret semua bilangan yang merupakan kelipatannya 5
), banyaknya operasinya adalah O(n)
.
Jadi, kerumitannya pasti O(n^3)
. Apa kamu setuju?
Jawaban:
Anda n / 2 + n / 3 + n / 5 +… n / 97 bukanlah O (n), karena bilangan suku tidak konstan. [Edit setelah Anda edit: O (n 2 ) terlalu longgar batas atasnya.] Batas atas longgar adalah n (1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6 +… 1 / n) (jumlah kebalikan dari semua bilangan hingga n), yaitu O (n log n): lihat bilangan Harmonic . Batas atas yang lebih tepat adalah n (1/2 + 1/3 + 1/5 + 1/7 +…), yaitu jumlah kebalikan dari bilangan prima hingga n, yaitu O (n log log n). (Lihat di sini atau di sini .)
Bit "temukan bilangan prima berikutnya" hanya O (n) secara keseluruhan, diamortisasi - Anda akan bergerak maju untuk mencari bilangan berikutnya hanya n kali total , bukan per langkah. Jadi seluruh bagian dari algoritma ini hanya membutuhkan O (n).
Jadi dengan menggunakan keduanya Anda mendapatkan batas atas O (n log log n) + O (n) = O (n log log n) operasi aritmatika. Jika Anda menghitung operasi bit, karena Anda berurusan dengan bilangan hingga n, operasi tersebut memiliki sekitar log n bit, yang mana faktor log n masuk, memberikan operasi bit O (n log n log log n).
sumber
Ingatlah bahwa ketika Anda menemukan bilangan prima
P
saat mengayak, Anda tidak mulai mencoret bilangan pada posisi Anda saat ini +P
; Anda benar-benar mulai mencoret angka padaP^2
. Semua kelipatanP
kurang dariP^2
akan dicoret dengan bilangan prima sebelumnya.sumber
p
ataup^2
, kompleksitasnya sama (dengan array akses langsung).SUM (1/p) {p<N} ~ log (log N)
adalah alasannya.n/i
langkah - langkah, di manai
adalah prime => seluruh kompleksitasnyasum(n/i) = n * sum(1/i)
. Menurut deret harmonik prima,sum (1/i)
tempati
prima adalahlog (log n)
. Secara totalO(n*log(log n))
,.Saya pikir loop atas dapat dioptimalkan dengan mengganti
n
dengansqrt(n)
kompleksitas waktu secara keseluruhan akanO(sqrt(n)loglog(n))
:sumber
isprime
benar-benar nama yang salah untuk digunakan di sana.lihat penjelasan di atas loop dalam adalah penjumlahan harmonis dari semua bilangan prima hingga akar (n). Jadi, kompleksitas sebenarnya adalah O (akar (n) * log (log (akar (n))))
sumber