Analisis Kompleksitas Algoritma

advertisement
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
Download