Kompleksitas waktu algoritma Sieve of Eratosthenes

95

Dari Wikipedia:

Kompleksitas dari algoritma ini adalah O(n(logn)(loglogn))operasi bit.

Bagaimana Anda sampai pada hal itu?

Bahwa kompleksitas termasuk loglognistilah 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 7setelah mencoret semua bilangan yang merupakan kelipatannya 5), banyaknya operasinya adalah O(n).

Jadi, kerumitannya pasti O(n^3). Apa kamu setuju?

Lazer
sumber
5
Saya tidak tahu tentang sisanya (terlalu matematis untuk otak saya yang terlalu mengantuk saat ini), tetapi akar kuadrat berasal dari fakta bahwa jika sebuah bilangan tidak memiliki pembagi kurang dari akar kuadratnya, itu adalah bilangan prima. Juga, saya baru tahu bahwa loglog (n) berarti ada akar kuadrat. Bagus.
R. Martinho Fernandes
13
Bagaimana loglog (n) yang ada di sana berarti ada akar (n) di suatu tempat? (@Martinho: Mengapa Anda mengatakan Anda "baru saja mempelajari ini"?) Analisis sebenarnya tidak melibatkan akar kuadrat!
ShreevatsaR

Jawaban:

118
  1. 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 .)

  2. 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).

ShreevatsaR
sumber
Untuk satu bagian masalah, Anda sedang mempertimbangkan kompleksitas asimtotik. Untuk bagian lain, Anda mempertimbangkan kompeksitas yang diamortisasi. Saya bingung.
crisron
2
@ Crisron Apa masalahnya? Bukan kasus bahwa "kompleksitas asimtotik" dan "kompleksitas diamortisasi" adalah dua jenis yang berbeda dari hal yang sama. Amortisasi hanyalah teknik untuk menghitung sesuatu dengan lebih hati-hati, yang dapat terjadi menjadi kompleksitas asimtotik.
ShreevatsaR
Semua ini sementara saya dulu menganggap mereka berbeda. Terima kasih telah menjelaskannya.
crisron
1
@ShreevatsaR Mengapa kita menghitung jumlah deret harmonik hingga n suku. Bukankah kita harus menghitung sampai akar pangkat dua (n)? Memberikan jawaban sebagai theta dari n (loglogsqrt (n)) operasi aritmatika? Selain itu, wikipedia mengatakan bahwa kompleksitas ruang adalah O (n). Bukankah seharusnya itu theta dari n karena kita membutuhkan sebuah array dari n elemen dalam kasus apapun?
a_123
@ s_123 Ya, Anda hanya dapat menghitung hingga √n suku, tetapi tidak ada perbedaan dalam analisis asimtotik (atau bahkan perbedaan praktis yang signifikan dalam waktu berjalan), karena log (√x) = (1/2) log x untuk sembarang x. Jadi Θ (n log log √n) = Θ (n log log n). Untuk pertanyaan Anda yang lain, ya, kompleksitas ruangnya adalah Θ (n), yang juga merupakan O (n): penggunaan O () adalah hal yang biasa untuk menunjukkan bahwa Anda menentukan batas atas, alih-alih mengatakan Θ () untuk menunjukkan bahwa itu adalah batas bawahnya juga (terutama jika batas bawahnya sudah jelas, seperti di sini).
ShreevatsaR
7

Kompleksitas termasuk istilah loglogn memberi tahu saya bahwa ada akar persegi (n) di suatu tempat.

Ingatlah bahwa ketika Anda menemukan bilangan prima Psaat mengayak, Anda tidak mulai mencoret bilangan pada posisi Anda saat ini + P; Anda benar-benar mulai mencoret angka pada P^2. Semua kelipatan Pkurang dari P^2akan dicoret dengan bilangan prima sebelumnya.

jemfinch
sumber
10
pernyataan ini pada dirinya sendiri benar, tetapi tidak ada sangkut pautnya dengan pernyataan yang dikutip yang tidak ada manfaatnya. Baik kita mulai dari patau p^2, kompleksitasnya sama (dengan array akses langsung). SUM (1/p) {p<N} ~ log (log N)adalah alasannya.
Will Ness
6
  1. Loop dalam melakukan n/ilangkah - langkah, di mana iadalah prime => seluruh kompleksitasnya sum(n/i) = n * sum(1/i). Menurut deret harmonik prima, sum (1/i)tempat iprima adalah log (log n). Secara total O(n*log(log n)),.
  2. Saya pikir loop atas dapat dioptimalkan dengan mengganti ndengan sqrt(n)kompleksitas waktu secara keseluruhan akan 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
sumber
2
tidak, mengganti n dengan akar (n) membuatnya ~ n log log (sqrt n) yang masih ~ n log log n. dan isprimebenar-benar nama yang salah untuk digunakan di sana.
Will Ness
-1

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))))

Bharath Kumar Reddy Appareddy
sumber
2
salah. kami menandai semua jalan ke 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