Matakuliah Tahun : T0034 / Perancangan & Analisis Algoritma : 2008 Pertemuan 4 ANALISIS KOMPLEKSITAS ALGORITMA BILANGAN PRIMA • Bilangan Prima : bilangan yang hanya memiliki 2 faktor pembagi, yaitu hanya habis dibagi bilangan 1 dan bilangan itu sendiri • Cara menghitung pembagian dalam pseudocode 21 div 4 = 5 21 mod 4 = 1 • Kasus : bagaimana membuat sebuah pseudocode yang dapat menyatakan apakah N bilangan prima atau bukan? Bina Nusantara ALGORITMA DASAR BILANGAN PRIMA • Sesuai dengan definisi bilangan prima, algoritma harus mencari apakah sebuah bilangan N memiliki 2 faktor. • Cara menyelidiki dengan mencoba satu per satu kemungkinan. • Pseudocode 3.7a berisi sebuah algoritma dasar. • Algoritma itu diperbaiki tahap demi tahap hingga menghasilkan pseudocode 3.7d [buku utama, bab 3.3] Bina Nusantara PSEUDOCODE 3.7a 1 2 3 4 5 6 7 8 9 10 11 iJumFak=0 for i=1 to N do if (N mod i)=0 then iJumFak=iJumFak+1 end if end for if iJumFak=2 then bPrima=true else bPrima=false end if Bina Nusantara 1 N N N 1 1 PSEUDOCODE 3.7b 1 2 3 4 5 6 7 8 9 10 11 iJumFak=2 for i=2 to (N-1) do if (N mod i)=0 then iJumFak=iJumFak+1 end if end for if iJumFak=2 then bPrima=true else bPrima=false end if Bina Nusantara 1 N-2 N-2 N-2 1 1 PSEUDOCODE 3.7c 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 if N>1 then iJumFak=2 else iJumFak=1 end if for i=2 to (N-1) do if (N mod i)=0 then iJumFak=iJumFak+1 end if end for if iJumFak=2 then bPrima=true else bPrima=false end if Bina Nusantara 1 1 N-2 N-2 N-2 1 1 PSEUDOCODE 3.7d 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 if N>1 then iJumFak=2 else iJumFak=1 end if for i=2 to (N div 2) do if (N mod i)=0 then iJumFak=iJumFak+1 end if end for if iJumFak=2 then bPrima=true else bPrima=false end if Bina Nusantara 1 1 N/2-1 N/2-1 N/2-1 1 1 MASALAH BARU • Apakah pseudocode 3.7d masih bisa diperbaiki? – Mungkin saja masih bisa, tapi untuk pembahasan selanjutnya akan digunakan pseudocode 3.7d sebagai acuan. • Masalah tadi baru meneliti apakah N bilangan prima atau bukan. Sekarang bagimana jika masalah diubah menjadi “tampilkan bilangan prima dari 1 sampai N!” – Berarti kita perlu memeriksa bilangan 1, 2, 3, ... sampai N dan memeriksa apakah prima atau bukan. – Jika prima, tampilkan. Bina Nusantara PSEUDOCODE 3.8 1 for X=2 to N do 2 iJumFak=2 3 for i=2 to (X div 2) do 4 if (X mod i)=0 then 5 iJumFak=iJumFak+1 6 end if 7 end for 8 if iJumFak=2 then 9 display X,” ” 10 end if 11 end for Bina Nusantara MENGUJI ALGORITMA • • • Berikutnya kita akan menguji jalannya pseudocode 3.8 untuk menghitung bilangan prima 1 hingga 1.000.000 Ternyata untuk menghitung bilangan prima antara 1 sampai 1.000.000 saja memerlukan waktu sekitar 1 jam 10 menit Bayangkan jika kita perlu menghitung bilangan prima antara 1 hingga 1.000.000.000! N Bina Nusantara Waktu yang diperlukan 1 0 ms 10 0 ms 100 0 ms 1.000 0 ms 5.000 100 - 135 ms 10.000 450 - 600 ms 100.000 45.000 - 50.000 ms 1.000.000 Sekitar 4.200.000 ms TEKNIK FLAGGING/SIEVE • Mencari bilangan mana saja yang tidak prima. • Ide dasar : – Bilangan tidak prima adalah bilangan yang merupakan kelipatan dari bilangan prima lainnya. – Bilangan yang tidak prima bisa dicatat dalam sebuah array – Array berisi flag (penanda) apakah sebuah bilangan prima atau bukan Bina Nusantara PSEUDOCODE 3.9 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 T[1]=”X” for Z=2 to N do T[Z]=”?” end for for Z=2 to N do if T[Z]=”?” then T[Z]=”P” for i=2 to (N div Z) do if T[Z*i]=”?” then T[Z*i]=”X” end if end for end if end for for Z=1 to N do if T[Z]=”P” then display Z,” ” end if end for Bina Nusantara MEMBANDINGKAN ALGORITMA • Hasil pengujian membandingkan pseudocode 3.8 dan pseudocode 3.9 menunjukkan perbedaan yang sangat mencolok. • Perhitungan untuk N=1.000.000 yang memerlukan waktu sejam lebih dengan pseudocode 3.8 ternyata memerlukan waktu kurang dari 0,2 detik dengan pseudocode 3.9 • Kontras sekali bukan? N Bina Nusantara Pseudocode 3.8 Pseudocode 3.9 < 1.000 0 ms 0 ms 5.000 100 - 135 ms 0 - 15 ms 10.000 450 - 600 ms 0 - 15 ms 100.000 45.000 - 50.000 ms 0 - 15 ms 1.000.000 Sekitar 4.200.000 ms 120 - 125 ms MENGHITUNG JUMLAH PERULANGAN N Bina Nusantara 3.8 3.9 N 3.8 3.9 1 0 1 11 25 28 2 0 3 12 30 32 3 2 5 13 36 34 4 3 8 14 42 38 5 5 10 15 48 42 6 7 14 100 2.426 345 7 10 16 1.000 249.169 3.957 8 13 19 5.000 6.245.670 21.068 9 16 22 10.000 24.991.230 43.070 10 20 26 100.000 2.499.909.593 456.807 1.000.000 249.999.078.499 4.775.209 EFEKTIVITAS ITU RELATIF • Apakah kita bisa menyimpulkan bahwa teknik flagging selalu lebih baik untuk memecahkan kasus bilangan prima? • Ternyata tidak selalu ! • Teknik flagging efektif untuk menghitung bilangan prima 1 hingga N • Coba terapkan teknik flagging untuk menghitung apakah N bilangan prima atau bukan Bina Nusantara PSEUDOCODE 3.10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 T[1]=0 for X=2 to N do T[X]=1 end for for X=2 to N do if T[X]=1 then for i=2 to (N div X) do if T[X*i]=1 then T[X*i]=0 end if end for end if end for if T[X]=1 then bPrima=true else bPrima=false end if Bina Nusantara PERBANDINGAN • Pseudocode 3.10 dan pseudocode 3.7d memecahkan kasus yang sama, karena itu akan coba dibandingkan N Bina Nusantara 3.7d 3.10 N 3.7d 3.10 1 0 0 11 4 17 2 0 1 12 5 20 3 0 2 13 5 21 4 1 4 14 6 24 5 1 5 15 6 27 6 2 8 100 49 245 7 2 9 1.000 499 2.957 8 3 11 5.000 2.499 16.068 9 3 13 10.000 4.999 33.070 10 4 16 100.000 49.999 356.807 1.000.000 499.999 3.775.209 ANALISIS • Ternyata teknik flagging justru bekerja sangat lambat jika digunakan untuk menangani kasus awal, yakni menghitung apakah N bilangan prima atau bukan. • Sebuah teknik yang baik untuk mengatasi sebuah kasus belum tentu baik untuk mengatasi masalah yang lain Bina Nusantara LATIHAN • Pikirkan lagi sebuah cara untuk memperbaiki pseudocode 3.7d ! • Buatlah sebuah algoritma untuk menampilkan N bilangan prima yang pertama! Bina Nusantara REVIEW • Apa yang sudah dipahami? • Apa yang akan dibahas selanjutnya? Bina Nusantara