Disusun Oleh
Wijanarto, M.Kom
Pada revisi dua ini diktat Strategi dan analisa algoirtma, mengalami perubahan mayor,
yaitu update sebanyak 2 bab, yang diletakan pada bab 2, Overview analisa algoritma dan 3,
Notasi asimtotik. Pada revisi sebelumya tidak ada, revisi ini di buat karena selama buku pada
revisi 1 di ajarkan siswa kurang kuat memahami erhitungan kompleksitas algoritma,
dikarenakan dasar pemahaman pembacaan algoritma kurang bagus. Dua bab yang di
tambahkan bertujuan sebagai dasar memahami bab selanjutnya, khususnya kompleksitas
algoritma dan notasi asimptotik. Selain itu juga di berikan beberapa contoh persoalan pada
bab-bab tertentu, dan akan berkembang terus, karena pada dasarnya buku ini jauh dari
kesempurnaan. Kedepan, tiap tahunnya akan di lakukan revisi, baik mayor maupun minor
sekuat tenaga, untuk memajukan pendidikan tinggi indonesia.
Semarang, 2012.
wijanarto
2
Daftar Isi
BAB I.......................................................................................................................................................... 7
BAB II....................................................................................................................................................... 22
BAB III...................................................................................................................................................... 36
BAB IV...................................................................................................................................................... 50
3
4.2. PENGUKURAN .......................................................................................................................................50
4.2.1. EFISIENSI WAKTU .....................................................................................................................51
4.2.2. EFISIENSI SPACE MEMORI ......................................................................................................54
4.2.3. KEMUDAHAN IMPLEMENTASI ................................................................................................55
4.2.4. DATA MOVEMENT (SORTING) .................................................................................................55
4.2.5. STABILITY (SORTING) ...............................................................................................................55
4.3. EFISIENSI ALGORITMA...........................................................................................................................56
4.4. SPACE DAN MEMORY ............................................................................................................................57
4.4.1. PROCEDURE/FUNCTION CALL ...............................................................................................58
4.4.2. STRUKTUR PROGRAM ..............................................................................................................58
4.4.2.1. OPERATOR, ARRAY DAN POINTER .........................................................................................59
4.4.2.2. SEKUENSIAL...............................................................................................................................59
4.4.2.3. BRANCHING ...............................................................................................................................60
4.4.2.4. LOOPING ....................................................................................................................................61
4.4.2.4.1. FOR LOOP KASUS 1 ..............................................................................................................61
4.4.2.4.2. FOR LOOP KASUS 2 ..............................................................................................................62
4.4.2.4.3. FOR LOOP KASUS 3 ..............................................................................................................63
BAB V ...................................................................................................................................................... 66
BAB VII..................................................................................................................................................... 80
4
7.3.8. TREE ............................................................................................................................................92
7.4. MINIMUM SPANNING TREE (MST) ........................................................................................................93
7.4.1. ALGORITMA KRUSKAL .............................................................................................................93
7.4.2. ALGORITMA PRIM .....................................................................................................................97
7.4.3. SHORTEST PATH : ALGORITMA DIJKSTRA..........................................................................102
7.4.4. SHORTEST PATH : ALGORITMA KNAPSACK........................................................................104
7.4.4.1. SECARA MATEMATIS...............................................................................................................104
7.4.4.2. SECARA GREEDY .....................................................................................................................105
8.1. DEFINISI...............................................................................................................................................109
8.2. RUNNING TIME DARI ALGORITMA DIVIDE DAN CONQUER ................................................................111
8.3. TEOREMA MENCARI O(F(N)) UNTUK METODE D AND C ......................................................................114
8.4. ALGORITMA SORTING .........................................................................................................................114
8.4.1 INSERTION SORT .................................................................................................................................114
8.4.2 SELECTION SORT .................................................................................................................................116
8.4.3 BUBBLE SORT ......................................................................................................................................118
8.4.4 SEQUENTIAL SORT...............................................................................................................................119
8.4.5 MERGE SORT .......................................................................................................................................121
8.4.6 QUICK SORT ........................................................................................................................................124
8.5. ALGORITMA SEARCHING.....................................................................................................................126
8.5.1 SEQUENTIAL SEARH ...................................................................................................................126
8.5.2 BINARY SEARH .............................................................................................................................130
8.5.3 INTERPOLATION SEARH .............................................................................................................132
6
BAB I
STRATEGI DAN ANALISA ALGORITMA
1.1. PENDAHULUAN
Di dalam disiplin ilmu komputer, pembahasan strategi dan analisis terhadap suatu
algoritma, yaitu suatu masalah merupakan trigger untuk membuat atau memilih strategi yang
tepat dalam menyelesaikannya menjadi topic penting. Jadi bagaimana kita akan
menyelesaikan suatu masalah adalah pekerjaan pertama sebelum di tuangkan dalam suatu
bahasa. Pemahaman struktur data dan algoritma dengan di dukung penguasaan suatu bahasa
tertentu, sehingga akan lebih mudah di komunikasikan dengan komputer dalam penyelesaian
masalah tersebut, menjadi prasyarat utama dalam kuliah ini. Syarat utama dalam mengikuti
dan mempelajari buku ini, adalah mahasiswa sudah pernah menempuh mata kuliah dasar
pemrograman, algoritma dan pemrograman, struktur data dan matematika diskrit.
Penerapan cara pembelajaran pada matakuliah Strategi dan Analisis Algoritma secara
umum ditujukan untuk memberikan pembekalan kepada mahasiswa dalam berfikir secara
logis, kritis, kreatif dan analitis dalam memecahkan masalah berbasis program komputer.
Secara khusus pada matakuliah kedepan akan diberikan ketrampilan baru dalam hal
pengukuran efisiensi dan waktu tempuh suatu algoritma, yaitu mengukur seberapa efisien
langkah-langkah serta berapa banyak waktu yang di perlukan untuk pemecahan suatu
masalah. Disamping itu kemampuan kepemimpinan (leadership) dan kemampuan bekerja
sama dalam sebuah kelompok (team work) juga akan ditanamkan melalui tugas-tugas
kelompok dan presentasi-pesentasi tugas terstruktur baik dalam hal penguasaan audiens,
menjawab pertanyaan maupun penyampaian materi. Hal tersebut sesuai dengan tujuan
pendidikan bidang ilmu komputer diantaranya adalah mempunyai pengetahuan dan
ketrampilan yang cukup untuk bekerja dalam bidang-bidang yang menyangkut pengelolaan
komputer maupun penggunaan dan pemanfaatan dalam bidang teknologi informasi.
Pada bagian ini, akan di berikan bekal dasar pemahaman mengenai Konsep Strategi dan
Analisis algoritma, tujuan utama dari bab ini supaya mahasiswa dapat memahami Algoritma
dan Struktur Dasar Algoritma, serta mampu mengidentifikasikan dan menjelaskan definisi
dasar strategi dan analisis algoritma. Sedangkan pokok bahasan yang menjadi topik utama
7
adalah mengenai review algoritma, komponen algoritma, Konektifitas Strategi dan Analisis
algoritma serta latar belakang untuk memahaminya secara matematis. Setelah mempelajari
bab ini, di harapkan mahasiswa dapat menjelaskan dan membedakan definisi dasar strategi
dan analisa algoritma, serta memanfaatkan dalam dunia pemrograman.
Kembali ke suatu masalah, kita dapat saja menyelesaikannya dengan cara Langsung
kerjakan, Tebak dan untung-untungan, Trial error, Pengalaman , "Scientifically“ (secara
ilmiah ). Pilihan tergantung pada kita, akan tetapi dalam kuliah ini kita akan mendekati secara
ilmiah, dimana terdapat urut-urutan langkah tertentu yang harus di kerjakan. Prinsip umum
yang paling mudah di mengerti dalam proses memecahkan masalah adalah melakukan
analisis, disain, implementasi dan kompilasi.
Tentu saja urutan di atas dilakukan berbasis komputer. Pada saat menganalisis kita harus
menentukan masalah yang di hadapi, sedang pada tahap disain kita sudah dapat menentukan
algoritma mana yang harus dipakai dalam rangka pemecahan masalah tersebut. Implementasi
merupakan tahap koding, dan debugging, dan terakhir adalah mengkompilasi penyelesaian
masalah dalam bentuk yang di mengerti komputer.
Secara mendasar maka dapat di katakan bahwa penyelesaian masalah dalam kuliah ini
adalah seperti gambar 1 di bawah ini. Penyelesaian suatu masalah di awali dengan adanaya
masalah itu sendiri untuk di analisa, dimana kita dapat melakukan penyataan, menurunkan,
memvalidasi masalah tersebut untuk di disain penyelesaiannya. Disain algoritma selanjutnya
8
harus di ekspresikan menjadi suatu program untuk dilakukan pengujian apakah sudah
mendapatkan solusi dari masalah yang ada.
MASALAH
PROGRAM KOMPUTER
SOLUSI
MASALAH
Gambar 1. Diagram Proses Penyelesaian Masalah
Sehingga dari paparan di atas kita menjadi tahu di mana letak kuliah ini, yaitu
mencoba menyelelesaikan masalah melalui pemilihan algoritma, dan dengan ini maka kita
akan review mengenai algoritma itu sendiri. Untuk mempersingkat ruang dan waktu maka
secara sederhana maka definisi Algoritma adalah Kumpulan atau himpunan langkah-langkah
yang berhingga untuk menyelesaikan masalah dengan menggunakan komputer, dengan
aturan:
9
1.3. KOMPONEN ALGORITMA
Suatu algoritma dapat saja terdiri dari beberapa komponen pokok, dimana komponen ini
menentukan suatu algoritma akan bekerja, di antaranya adalah :
Untuk bahasan yang lebih detail akan di berikan pada kuliah selanjutnya. Dengan demikian
ada suatu transformasi dari suatu algoritma menjadi suatu program dengan memanfaatkan
bahasa tertentu dan mengolah komponen algoritma yang ada dan di harapkan dapat
menyelesaikan masalah yang di hadapi.
11
1.4.4.1. SEKUENSIAL
Struktur sekuensial merupakan urutan suatu proses dimana langkah suatu proses
tersebut di lakukan secara berurutan, dan tidak dapat saling tumpang tindih, artinya suatu
langkah mempunyai inisial awal yang akan dapat di kerjakan oleh langkah berikutnya,
sebaliknya langkah terakkhir hanya di dapat apabila urutan langkah sebelumnya di kerjakan
dengan benar. Ini merupakan konsep dasar dalam pemrograman prosedural atau top-down
programming. Secara ilustratif maka struktur sekuensial dapat di gambarkan dalam bagan di
gambarkan sebagai berikut :
Langkah ke-1
Langkah ke-n
1.4.4.2. BRANCHING
Pencabangan atau branching merupakan struktur dasar algoritma lainnya yang
memegang peranan penting baik dalam disain suatu program atau disain hardware (optimasi
kompilasi). Karena pada level rendah suatu program atau algoritma nanti di proses secara
sekuensial (dalam assembli) dan pencabangan merupakan hal yang mempengaruhi kecepatan
pemrosesan (oleh prosesor dan memori).
Pencabangan merupakan suatu struktur yang paling sering di pakai dalam algoritma
dan merupakan otak dari algoritma itu sendiri, karena pemilihan langkah selanjutnya
merupakan hasil analisa dari struktur ini. Pengambilan keputusan untuk melaksanakan
perintah atau pernyataan berawal dari adanya suatu kondisi yang di berikan oleh struktur
branching ini. Biasanya suatu kondisi hanya bernilai benar atau salah dari suatu pernyataan
12
dalam bentuk logika atau relasional dari suatu operasi yang di berikan. Oleh karena itu
memahami operasi dan operator baik dalam algoritma atau pemrograman menjadi penting.
Dalam gambar 1.3 di bawah ini di berikan ilustrasi bagan pencabangan atau sering juga di
sebut kondisional.
Secara notasi seringkali di berikan dengan IF (Kondisi) THEN (AKSI 1) ELSE (AKSI
N). Variasi pencabangan dapat di bagi secara nested dan cascade. Pencabangan cascade
merupakan pencabangan yang terstruktur seperti bertumpuk. Sedangkan pencabangan nested
merupakan pencabangan yang di dalamnya ada pencabangan lainnya begitu seterusnya. Di
bawah ini di berikan gambaran mengenai maksud dari kedua hal tersebut.
1.4.4.3. LOOPING
Perulangan atau looping atau kalang merupakan bagian dari struktur algoritma dasar
lainya yang penting. Di katakan demikian karena kita sering mengulang sesuatu operasi atau
pernyataan yang sifatnya repetitif dan banyak. Dengan demikian, berhubungan dengan suatu
13
perulangan, struktur ini memberi keleluasaan pada kita untuk mengulang suatu proses tanpa
pernah salah dan lelah. Perulangan dapat di notasikan dengan berbagai macam cara, tetapi
yang umum adalah REPEAT.....UNTIL (KONDISI), WHILE (KONDISI) DO dan FOR
AWAL TO AKHIR DO. Secara algoritmik kita dapat menyesuaikan dengan bahasa
yang akan kita pakai. Notasi di atas mirip dengan bahasa pascal, apabila kita dekatkan
ke bahasa C maka akan menjadi do.....while(kondisi), while(kondisi) dan for (awal;akhir;step).
Sedangkan ilustrasi dari perulangan secara flow chart dapat di gambarkan seperti gambar 1.5
di bawah ini.
• Validitas
Algoritma harus benar, artinya memberikan keluaran yang di kehendaki
• Efektifitas
Tepat guna, hasil guna, akurat, mencapa tujuan, aman , kebenaran algoritma tersebut
merespon terhadap inputan apapun
• Efisiensi
14
Hemat, Cepat dengan space memori yang kecil , Space yang di perlukan
Waktu/banyak langkah atau waktu tempuh yang di gunakan oleh :
• Banyaknya statement
• Jenis statement/struktur
• Banyak operasi aritmatik dan logik
• Procedure dan fungsi call
• Built-in function
• User define
• Recursif
• Non recursive
• Berhingga langkahnya
Suatu agoritma akan berhenti pada suatu saat
• Logis dan terstruktur
Urutan langkahnya dapat di pertanggungjawabkan, artinya rumusan solusi berdasarkan
logika, tidak coba-coba. Setiap langkah yang ada dalam algoritma tersebut terstruktur
dengan baik, artinya tidak ada langkah yang saling overlap satu dengan lainnya
(menghindari pemakaian goto) .
Jadi Suatu Analisis algoritma adalah studi mengenai waktu dan ruang terhadap suatu
algoritma, dimana waktu di ukur melalui kecepatan pemrosesan yang di bandingkan dengan
kebutuhan ruang memori pada algoritma tersebut. Memori di pengaruhi oleh pemakaian
variable, pemanggilan fungsi dana pemakaian stack dalam pemroses. Sedangkan kecepatan
tergantung pada peralatan utama yang mungkin, misalnya cache memori, jumlah langkah
algoritma, jumlah operasi (operand an operator). Kebutuhan ruang/space dan kecepatan
(waktu tempuh) inilah yang di sebut sebagai KOMPLEKSITAS ALGORITMA. Space
sering unpredicted, terutama jika pemakaian pointer dominan dan biasanya space tidak di
libatkan dalam analisis algoritma secara langusng kecuali tipe data yang di pakai adalah tipe
data statis. Sedang Strategi algoritma adalah bagaimana merencanakan atau menentukan
suatu model penyelesaian masalah, untuk itu perlu di buat disain yang memenuhi aspek
algoritma yang di maksud, serta bagaimana memilih model penyelesian masalah yang sudah
ada sehingga di pandang dapat dengan tepat untuk itu.
15
a. Ada n0 N sehingga P(n0) benar
b. Untuk setiap n n0, jika P(n) benar maka P(n+1) juga benar
Atau secara formal, prinsip induksi matematika dapat di jelaskan sebagai berikut,
missal untuk P(n) yang merupakan pernyataan yang di definisikan dalam bilangan bulat n dan
misalkan a adalah bilangan bulat tetap, maka pernyataan tersebut benar :
a. P(a) Benar, ini di sebut sebagai langkah basis.
b. Jika P(n) benar maka p(n+1) benar untuk na, ini di sebut sebagai langkah
induksi.
Contoh :
1
P(n)=1+2+3+4+…+n= n( n 1)
2
1
P(1)=1= .1(1 1) , adalah BENAR (basis)
2
n1 dan P(n) adalah BENAR, maka
1
P(n)=1+2+#+4+…+n= n( n 1) adalah BENAR
2
1
P(n+1)=1+2+#+4+…+n+(n+1) = n( n 1) +(n+1) (induksi)
2
1
= (n+1)(n+2)
2
1
= (n+1)((n+1)+1), juga BENAR
2
1.6.2. FUNGSI
Fungsi adalah dua himpunan elemen, A dan B, dan aturan f, yang meerupakan pemetaan
untuk setiap elemen dalam A, pada salah satu unsur dalam B. Suatu fungsi dinotasikan sebagai
f: A B. Pemetaan dari suatu himpunan A ke himpunan B yang memenuhi syarat :
a. Jika a1,a2 A, dan b1,b2B, serta b1 peta a1 dan b2 peta a2, dan jika a1=a2, maka
b1=b2.
b. Setiap aA dan bB, sehingga b merupakan peta dari a, di gambarkan sebagai
a1 b1
a3 b2
a4 b5
Nilai fungsi di a4 dan a2
p(n):fakto(n)=n!
f(a)=b
1.6.3. BARISAN
Merupakan fungsi dengan himpunan asal berupa bilangan asli, jika an merupakan nilai
fungsi f di n, maka an=f(n) dan dapat ditulis an n 1,2,3,... disebut dengan BARISAN.
Contoh 1 :
1
an = f(n) =
n2
1 1 1 1
Barisannya adalah , , , ,…
1 2 2 2 32 4 2
Contoh 2:
an=f(n)=f(n-1)+f(n-2), untuk n3, maka barisannya adalah
a1=f(1)=1
a2=f(2)=1, jadi
a1,a2,a3,a4,a5,a6,…
1,1,2,3,5,8,13,21,…
Di sebut sebagai barisan Fibonacci.
17
Contoh 3:
n , n 1,2
a n f ( n)
3( f (n 2)) 2 , n 3
a1=1, a2=2,a3=3(f(1))2=3
a4=3(f(2))2=3X22=12
a5=3(f(3))2=3X32=27,…
barisannya adalah 1, 2, 3, 12, 27, 432,…..
1.6.4. DERET
Merupakan barisan dalam bentuk jumlahan barisan.
Contoh 1
Di ketahui barisan a1, a2 ,a3 ,a4 ,…, an,…
DERET1= a1,a1+a2,a1+a2+a3,…
DERET2=a1,a2,a1+a3,a2+a4,a1+a3+a5,a2+a4+a6,….
n
Maka deret1 dapat di tulis sebagai S n a i dan
i 1
n
a 2 i , n genap
i 1
Deret2 dapat di tulis sebagai S n n 1
2
a 2i 1 n gasal
i 1
Pada barisan maupun deret ada yang mempunyai konvergen atau divergen ke suatu
nilai, konvergen adalah apabila barisan atau deret tersebut menuju ke suatu nilai dan divergen
berarti barisan atau deret tersebut nilainya menyebar. Untuk barisan atau deret tak hingga
untuk menentukan konvergensi barisan atau deret tersebut di gunakan limit untuk barisan atau
deret.
18
Cara mencari konvergensinya adalah
n n 1 1 1
lim f (n) lim : lim
n n 1 n 1
1 0
1 , ingat =0.
n n
1
n
n
Jadi konvergen ke 1
n 1
Contoh 2
n 2 1 4 9 16
Barisan = , , , ,…
n 1 2 3 4 5
n2
f(n)=
n 1
n2 n n
lim f ( n) lim : lim
n 1 n n
1 1 0
n n
1
n
n2
Jadi tidak konvergen.
n 1
Contoh 3
Barisan (1) n =-1,1,-1,1,-1,1,-1,….??? Ini adalah barisan yang tidak konvergen
Teorema
Misalkan f(n) konvergen ke L1 dan g(n) konvergen ke L2, maka
F(n)g(n) konvergen ke L1L2
k.f(n) konvergen ke L1
f(n)*g(n) konvergen ke L1*L2
f ( n) L1
konvergen ke , untuk L20
g ( n) L2
Khusus untuk perkalian dan pembagian (* dan /) jika salah satu fungsinya tidak
konvergen, BELUM tentu hasilnya tidak konvergen, bias saja hasilnya konvergen.
Contoh
1
f(n)=n, g(n)=
n 1
lim f (n) lim n , tidak konvergen
n n
1 1
lim g (n) lim n 1 0 , konvergen ke 0
n n
1 n
An=f(n)*g(n)=n* = , jelas konvergen ke 1, karena 1
n 1 n 1
19
n
Jadi barisan { }konvergen ke 1.
n 1
a 0 n p a1 n p 1 ... a p
Untuk barisan Sn, dimana s n , maka
b0 n q b1 n q 1 ... bq
• Barisan Sn akan konvergen ke 0 jika p<q
a
• Barisan Sn akan konvergen ke 0 jika p=q
b0
• Barisan Sn akan tidak konvergen ke 0 jika p>q
n
Jadi, dari contoh tadi maka konvergen ke 1 karena p=q=….(1)
n 1
n2
Dan tidak konvergen karena p>q=2>1
n 1
Contoh
2 log n 0 log 2 log 3 log 4
2 2 2
2 log 8
konvergen ke 0, karena , , , ,…,
n 1 2 3 4 8
0 1 log 3 2 2 log 210 10
2
3
, , , ,…, ,…., 10 = 10 ini kecil sekali, sehingga
1 2 3 4 8 2 2
konvergen ke 0.
Contoh
n2 1
ini tidak konvergen, cara mencarinya
n log n
Cara 1
1
1 2
n2 1 n2 n 1
lim : 2 lim
n n log n n n log n 0
n
Cara 2 dengan de’lopital
n2 1 n n 1
lim
n n log n
lim
1
lim
n log n 1
lim lim n
n 1
n
log n n * n
n n
n
lim 1
n
log n n *
n
20
Latihan Soal
21
BAB II
OVERVIEW ANALISA ALGORITMA
2.1. PENDAHULUAN
Dalam disain dan analisis algoritma, tujuan utamanya adalah bagaimana mendisain
algoritma yang “cepat”. Hal ini berarti kita harus merencanakan disain algoritma yang dapat
diselesaikan dengan alat bantu komputer yang mendekati suatu seni atau “art” . Jadi tidak saja
mendisain di perlukan pemikiran yang mendalam, namun juga kreatifitas yang tinggi dari
disainernya. Pemikiran untuk melakukan disain tidak saja cukup dilakukan secara sembrono
asal kreatif, namun juga harus berlandaskan atas teknik-teknik yang “well define”. Sehingga
pada bagian lain dari buku ini kita juga akan mempelajari teknik-teknik umum yang
scientifically. Dengan mempelajari teknik-teknik ini diharapkan kita dapat menyelesaikan
masalah disain algoritma dalam kehidupan nyata.
Pendekatan yang di pakai dalam strategi algoritma atau disain dan analisis algoritma
ini adalah pertama, pendekatan analitis, kedua, kita akan mambangun model matematika
untuk suatu komputer dan dalam model matematika tersebut kita membuat disain algoritma ,
ketiga, mempelajari property algoritma dalam model tersebut dan yang terakhir adalah
mengetahui alasan mengenai algoritma tersebut, dengan kata lain di perlukan bukti untuk
menunjukan waktu tempuh algoritma tersebut. Dalam bab ini akan di pelajari mengenai
framework dasar suatu algoritma, yang menjelaskan apa arti “cepat” suatu algoritma.
Dilanjutkan dengan mempelajari teknik mendisain algoritma yang “cepat”, yang secara
simultan juga mempelajari contoh-contoh masalah optimasi yang akan di sajikan pada bab
berikutnya. Juga akan di sajikan penyederhanaan atau pemodelan disain algoritma akan di
bangun di atas model komputer abstrak (mesin abstrak) yang menjadi simulator untuk
memahami kecepatan suatu algoritma.
22
Format penulisan disain dapat dilakukan secara bebas, namun demikian dalam buku ini akan
di berikan standar penulisan tersendiri sebagai berikut :
Tabel 1. Templete Spesifikasi Problem
PROBLEM Deskripsi masalah yang di hadapi
INPUT Domain dari masalah, harus valid untuk di berikan pada algoritma
OUTPUT Range dari masalah, keluaran yang di harapkan, spesifikasinya harus jelas
ALGORITMA Notasi yang menjelaskan penyelesaian masalah
Dengan membuat standar, di harapkan kita dapat membuat disain dengan lebih mudah untuk
di telusuri, contoh,
Tabel 2. Problem Faktorisasi
Diberikan suatu bilangan n, tentukan semua faktor dari bilangan tersebut. Misal 6
PROBLEM
adalah faktor dari 12, tetapi 6 bukan faktor dari 13, 1,3 dan 5 adalah faktor 15.
INPUT n adalah suatu integer positif, dimana n>0.
OUTPUT Daftar (barisan) bilangan yang merupakan faktor yang dapat membagi n hingga habis.
ALGORITMA a. Bagi n dengan bilangan terkecil yang > 0, misal x, yang dapat membagi n.
b. Ulangi proses (a) dengan mengincremen nilai x, hingga n=x.
Dalam notasi algoritma dituliskan sebagai berikut :
i1
input(n);
while (ni) do
if n mod i = 0 then
output(i)
inc(i)
Contoh lainnya
Tabel 3. Problem Faktorisasi Prima
Diberikan suatu bilangan n, tentukan semua faktor prima dari bilangan tersebut. Faktor
prima adalah 2, 3, 5, 7, 11, 13, atau 17, yaitu bilangan yang hanya dapat dibagi oleh
PROBLEM
dirinya sendiri dan 1, tidak berarti bahawa semua bilangan ganjil merupakan faktor
prima.
INPUT n adalah suatu integer positif, dimana n>2.
OUTPUT Daftar (barisan) bilangan yang merupakan faktor prima dari bilangan n.
ALGORITMA 9. Cari faktor prima terkecil dari suatu bilangan
10. Bagi bilangan n tersebut dengan faktor prima terkecil.
11. Ulangi proses 2 dengan n=hasil bagi terakhir hingga mencapai 1.
Sebagai latihan silahkan tuliskan notasi algoritma untuk masalah di atas.
Contoh masalah GCD,
Tabel 4. Problem GCD
PROBLEM Diberikan dua buah bilangan m dan n, tentukan GCD dari dua bilangan tersebut.
INPUT m dan n adalah suatu integer positif, dimana m<n.
OUTPUT GCD (Greates Common Divisor) atau integer terbesar yang membagi (habis) m dan n.
ALGORITMA 1. Faktorisasi prima sederhana
a) Faktorisasi m : menemukan bilangan prima pada m
23
m1,m2,…mx, sedemikian sehingga m=m1Xm2…X mx.
b) Fakorisasai n : menemukan bilangan prima pada n
n1,n2,n3,…ny, sedemikian sehingga n=n1Xn2X…Xny
c) Identifikasi faktor-faktor umum (common factors) lalu kalikan dan
kembalikan hasilnya sebagai gcd
2. Euclid
a) Selama m tidak dapat membagi habis n maka lakukan
Tentukan r sebagai hasil bagi n dan m
Set nilai baru bagi n dengan m
Set nilai baru bagi m dengan r
b) Kembalikan m sebagai gcd
Selesaikan disain dari dua algoritma yang di berikan di atas dalam suatu notasi algoritma.
24
2.3.2. DEFINISI FORMAL DAN INFORMAL TERMINOLOGI DASAR
Perhatikan beberapa contoh berikut ini mengenai terminologi Problem :
a. gcd 2 bilangan
input : 36,48
output : 12
b. Menemukan shortest path pada peta
input : nama kota di p. jawa
output : jarak 2 kota yang berhubungan dengan input
c. Menemukan kata dalam kamus
input : “evolusi”, oxford
output : kata input dalam kamus
d. Diberikan suatu x-ray, tentukan penyakitnya.
input : Gambar x-ray
output : ya/tidak berpenyakit
Jadi Problem adalah spesifikasi dari suatu nilai valid input dan apakah terdapat valid
output yang dapat di terima oleh setiap valid input tersebut. Instance input : suatu nilai x
adalah input instance untuk problem P, jika x adalah input valid sesuai dengan spesifikasi.
Dari contoh di atas maka bilangan 36,48 dan 12 merupakan input dan output instance dari
problem gcd, begitu juga contoh lainnya untuk masing-masing problem.
Ukuran Input Instance (size of an input instance) secara formal dikatakan sebagai,
sejumlah sedikit yang di perlukan untuk merepresentasikan suatu input instance. Sedangkan
secara informal (lebih berguna), dikatakan sebagai tiap parameter yang tumbuh secara cepat
dengan ukuran formalnya. Dengan demikian terminologi Algoritma adalah suatu abstraksi
prosedur komputer yang memerlukan beberapa atau banyak nilai input dan menghasilkan
beberapa atau banyak nilai sebagai output.
Dikatakan abstrak, karena algoritma dapat di ekspresikan dengan berbagai cara, misal
gambar, psuedo code, rumus matematika, program, dan sebagainya. Dan yang terakhir adalah
Program yaitu merupakan ekspresi dari suatu algoritma dengan menggunakan suatu bahasa
yang di mengerti komputer.
25
bagian utama, yaitu Prosesor yang mengeksekusi program dan Memori, yaitu koleksi suatu lokasi,
mirip array.
0 m-1
Gambar 7. Layout Memory RAM
Sehingga dari gambar 7 diatas maka memori terdiri dari m lokasi, yang tiap lokasinya
mempunyai alamat (address). Untuk mengacu alamat maka kita akan mengakses nilai dari
alamat tersebut. Mulai dari 0 hingga m-1. Bagaimana kita akan mendisian dalam model RAM
ini ? Karena model RAM mengandung alamat yang di notasikan dengan angka, maka kita
akan menentukan suatu variabel untuk mengaksesnya, sehingga kita akan, memberi nama
pada variable di ijinkan. Juga tipe data seperti array, struktur dan primitive juga di ijinkan,
selain itu struktur data seperti list, tree juga dapat di oleh dalam RAM. Instruction Set of
Processor pada RAM di arsitektur ini adalah, setiap instruksi akan di kerjakan dalam satu
langkah. Ada 3 kelompok instruksi pada model ini yaitu :
a b c D
e f g h
Dalam RAM, akan di simpan seperti array satu dimensi sebagai berikut, A 1 .
a b c d e f g h
Gambar 9. Representasi Array 2 dimensi A1 dalam RAM
Sehingga untuk mengakses A[i,j] maka ekuivalen dengan A1[i*m+j], dimana m adalah
jumlah kolom dalam A, yaitu 4. Jadi missal C=A[i,j] di baca sebagai C=A 1[(i-1)*m+j],
sehingga dari operatornya kita tahu ada 3 langkah ditambah akses secara langung ke memori 1
langkah total ada 4 langkah. Bagaimana dengan suatu operasi yang melibatkan struktur dasar
algoritma, missal loop atau perulangan, dalam contoh berikut kita dapat menghitung langkah
array sebagai berikut,
for i=1 to n do
C[i]=A[i]+B[i];
endfor
27
1. i=1
2. if i>n then goto 9
3. X=A[i]
4. Y=B[i]
5. Z=X+Y
6. C[i]=Z
7. I=i+1
8. Goto 2
9.
Akan di 1. i=1
eksekusi
2. if i>n then goto 9
sekali tiap
iterasi. Jika 3. X=A[i] n langkah iterasi dalam body
iterasinya n,
4. Y=B[i]
maka instruksi
ini di eksekusi 5. Z=X+Y
n kali di 6. C[i]=Z n iterasi kali 2 langkah = 2n
tambah
eksekusi 7. I=i+1
kondisi 1 kali 8. Goto 2
9.
Total waktu tempuh untuk fragmen di atas adalah b*n+2n+(n+1)+1, b adalah body of loop
dalam iterasi sebanyak n, sehingga menjadi 2+n(b+3), dimana b terdiri dari 4 langkah, maka
akan di dapatkan 2+7n atau 7n+2. Dalam hal pemanggilan fungsi, untuk menghitung langkah
pada pemanggilan fungsi dalam algoritma adalah Waktu = Jumlah Argumen Fungsi.
Dalam hal ini kita akan mengacu pada sintak gaya bahasa c, artinya tipa data array dan
structure di katagorikan dalam pass by references dan variable primitive sebagai pass by
value. Dengan demikian dapat di simpulkan bahwa,
28
a) Model matematika harus dapat direlasikan dengan kenyataan
b) Perlu Analisa Algoritma untuk pemodelan dan disain yang bagus
c) Relevansi analisis kita untuk komputer sebenarnya
29
1. Dari instruksi yang pertama, buat variable sementara, temp untuk menampung nilai
array x[i],temp= x[i]
Untuk instruksi yang kedua tidak perlu di lakukan, misal temp1=X[i], sebab, dalam RAM ,
tampungan sudah di lakukan pada instruksi sebelumya, inilah yang di sebut sebagai
intelegence compiler. Sedangkan pada compiler nyata hal tersebut tidak dilakukan, karena
setiap instruksi harus di fetch dari memori untuk di lakukan cycle execution oleh prosesor.
Alasan lainnya kenapa di RAM tidak dilakukan tampungan pada instruksi ke dua, karena pada
kedua instruksi tersebut nilai x[i] tidak berubah, jadi oleh intelegence compiler dianggap satu
langkah saja.
for i=1 to n do
for j=1 to n do
C[i,j]=0
for k=1 to n do
C[i,j]=C[i,j]+A[i,k]*A[k,j]
endfor
endfor
endfor
Nilai median adalah nilai tengah dari sekumpulan data dalam range tertentu. Algoritma
untuk menemukannya ada banyak, namun kita akan coba analisa dengan menggunakan cara
straight forward. Disain algoritmanya adalah sebagai berikut untuk menyelesaikan masalah
pencarian data medium dari sekumpulan data hingga bilangan n.
median(x)
1.n=panjang(x)
2.for i=1 to n do
3. min=0
4. max=0
5. for j=1 to n
6. if x[i]>x[j] then min=min+1
7. if x[i]<x[j] then max=max+1
8. endfor
n max
9. if min< and then exit
2 n
2
10.endfor
Analisa algoritma pada prolem median di atas adalah sebagai berikut, kita akan melihat inner
loop, lalu keluar ke atas hingga lapisan terluar.
33
C langkah
1. median(x)
2. n=panjang(x)
3. for i=1 to n
4. min=0 n langkah
5. max=0 linear n,
6. for j=1 to n An+B
7. if x[i]>x[j] then min=min+1
8. if x[i]<x[j] then max=max+1
9. endfor
n max n langkah dalam
10. if min< and then exit linear n,
2 n maka dia berada
2 dalam quadratic n.
11. endfor dengan catatan
sebelum keluar dari
loop karena exit
n langkah
Jadi secara keseluruhan waktu
tempuhnya berada dalam quadratic,
Ax2+Bx+C
Tugas anda adalah membuktikan bahwa algoritma tersebut benar berada dalam order
quadratic dengan menghitung setiap langkahnya hingga terbentuk fungsi T(n)=Ax2+Bx+C.
34
Latihan Soal
1. Tuliskan tujuan membuat disain algoritma.
2. Apa arti kata “cepat” dalam terminology analisa algoritma
3. Disain dan analisa algoritma termasuk seni atau pengetahuan, bagaimana hubungan
keduanya.
4. Tulisakan template problem dan solusi untuk disain algoritma dengan suatu contoh
kehidupan sehari-hari
5. Kenapa disain algoritma perlu di modelkan, serta model apa yang tepat untuknya.
6. Jelaskan pengertian RAM (Random Access Machine) dan apa yang dapat di lakukannya.
7. Jelaskan perbedaan antara computer nyata dan RAM.
8. Jelaskan dengan istilah waktu tempuh maximum algoritma.
9. Hitunglah waktu tempuh pada fragmen berikut ini
for i=n to 1 do
if n mod 2 = 0 then
x=x+1;
n=n/2
else
x=x+1
n=3*n+1
if n=1 then break;
10. Apa arti persamaan T(n)= anxn+…+a1x+a0 dalam order suatu fungsi.
35
BAB III
NOTASI ASIMTOTIK
3.1. PENDAHULUAN
Suatu masalah mungkin memiliki solusi algoritmik yang banyak. Dalam rangka untuk
memilih algoritma terbaik untuk suatu tugas tertentu, kita harus dapat menilai berapa lama
solusi tertentu akan diperlukan saat dijalankan. Atau, lebih akurat, Anda harus dapat menilai
berapa lama dua solusi yang diperlukan saat dijalankan, dan memilih diantara dua algoritma
tersebut. Kita tidak perlu tahu berapa menit dan detik waktu yang di tempuh oleh algoritma
tersebutl, tapi kita perlu beberapa cara untuk membandingkan algoritma terhadap satu sama
lain.
Kompleksitas asimtotik adalah cara mengungkapkan komponen utama cost dari
algoritma, dengan menggunakan unit ideal kerja komputasi. Perhatikan, misalnya, algoritma
untuk menyortir setumpuk kartu, yang hasilnya dengan berulang kali mencari melalui dek
untuk kartu terendah. Kompleksitas asimtotik dari algoritma ini adalah kuadrat dari jumlah
kartu di dek. Perilaku kuadrat adalah istilah utama dalam formula kompleksitas, sehingga
dapat dikatakan, misalnya, jika kita punya dua kali ukuran dek kartu, maka pekerjaan
pengurutannya adalah empat kali lipatnya. Sehingga jika kita memiliki 52 kartu, maka kita
akan melakukan scanning selanjutnya ke kartu 51 dan seterusnya, dan jika di formulasikan
menjadi 52+51+…+2. Jika di berikan N kartu maka formulanya adalah 2+…+N yang sama
dengan ((N)*(N+1)/2)−1=((N2 +N)/2)−1=(1/2)N2+(1/2)N−1, dari formulasi tersebut kita
tahu bahwa N2 sangat mendominasi ekspresi tersebut dan inilah yang di sebut sebagai cost
perbandingan dari suatu algoritma. Sehingga secara asimptotik di katakana bahwa pada limit
N, cenderung kearah infinity, dan mendekati fungsi kuadratik ½ N2, dan dikatakn sebagai
O(N2).
Misalkan f(n) adalah cost, dalam kasus terburuk, dari satu algoritma, yang dinyatakan
sebagai fungsi dari ukuran masukan n, dan g(n) merupakan fungsi cost untuk algoritma yang
lain. Misalnya, untuk algoritma pengurutan, f(10) dan g(10) akan menjadi jumlah maksimum
langkah yang di ambil oleh algoritma dari list sejumlah 10 item. Jika, untuk semua nilai n≥ 0 ,
f(n) adalah kurang dari atau sama dengan g(n), maka kompleksitas algoritma dengan fungsi f
36
adalah sangat cepat. Namun, secara umum, kita konsern pada cost komputasi yaitu untuk
kasus dengan masukan yang besar, sehingga perbandingan dari f(n) dan g(n) untuk nilai kecil
n kurang signifikan dibandingkan dengan perbandingan dari f(n) dan g(n), untuk n lebih besar
pada threshold tertentu. Ini dikatakan sebagai batas performa algoritma, sehingga batas dari
contoh pengurutan di atas berada pada kuadratik. Pengelompokan fungsi inilah yang akan kita
pelajari pada bab berikut untuk membedakan waktu tempuh suatu algoritma yang berada pada
batasan tertentu. Notasi yang akan di pelajari adalah Notasi O (Big Oh), Omega dan Theta.
3.2. DEFINISI
Karena tujuan kuliah disain dan analisa algoritma atau strategi algoritma ini adalah :
a) mendisain algoritma yang cepat
b) menganalisa waktu tempuh yang di lakukan RAM
c) Karena hasil analisa dengan RAM tidak dapat di aplikasikan pada komputer lain, maka
kita akan mencari cara, supaya keberlakuan hasil analisis dapat di pakai oleh semua
komputer.
Contoh berikut adalah, jika pada RAM menghasilkan waktu tempuh (1) 10n3+5n2+7, kita
tahu bahwa T(n) tersebut berada pada area kubik, dan jika komputer lain menghasilkan (2)
2n3+3n+79, hal ini seharusnya dapat di nyatakan juga berada dalam ranah kubik. Dengan
demikian (1) dan (2) berada pada kelas yang sama. Oleh karena itu di perlukan suatu notasi
untuk menyatakan waktu tempuh, sedemikian rupa sehingga dapat berlaku di semua
komputer. Maka kita perlu menentukan pengkelasan fungsi (classes of function)
3.2.1. CLASSES OF FUNCTION
Beberapa terminologi dasar dalam memahami notasi asymptotic, merupakan
pengetahuan yang harus di mengerti terlebih dahulu. Semua fungsi yang menjadi output dari
analisa algoritma akan di kelompokan dalam suatu kelas untuk di berikan notasinya.
Asymptotic Notation merupakan notasi formal untuk mengungkapkan mengani suatu fungsi
dan mengklasifikasikannya, Asymptotic Analysis adalah menganalisis dan mengklasifikasikan
suatu fungsi ke dalam notasi asimptotik dan untuk mengklasifikasikan notasi kita perlu fitur-
fitur untuk melakukannya, ada 2 fitur utama yang perlu di jelaskan di sini yaitu :
a) Bagaimana meletakan fungsi yang berbeda ke dalam kelas yang sama, misal
10n3+5n2+17 dan 2n3+3n+79 seharusnya berada dalam satu kelas. Sehingga pengali
konstan (constant multiplier) harus diabaikan dalam kedua fungsi diatas.
37
10n3+5n2+17 2n3+3n+79
DIABAIKAN
38
f(n)=O(n2), seperti di tunjukan dalan fungsi f(n)=n2 adalah lebih besar dari fungsi f(n)=
4n+32 ke kanan dari n=8. Contoh lain jika di ekspresikan dengan limit, misakan :
lim f ( n )
c , untuk 0c
n g( n)
Contoh 1.
lim n 3 lim
n n 3 O(n 2 )
nn 2
n
Contoh 2.
lim n 2 n lim 1 1
1 n 2 n O(n 2 )
n n 2
n 1
y=f(n)
f(n)=4n2 f(n)=2n2
400 f(n)=n2
f(n)=4n+32
200
0 5 10 15 20 25
n
Gambar 17. Fungsi f(n)=4n+32 = O(n2)
Contoh lain,
• 1000 n2 O(n3) karena
f(n) ≤ c.n3 , untuk c=1
1000.n2 ≤ n3
0 ≤ n3-1000.n2
untuk n ≥ 1000, c=1, maka n0=1000
Sehingga memenuhi f(n) ≤c.g(n) untuk semua integer n≥n0
39
• 1000 n2 O(n2), Carilah c dan n
1000 n2 O(n2)
1000 n2 ≤ c n2 , untuk c = 1000, maka
1000 n2 ≤ 1000 n2 , n ≥ 1, n0=1
• Apakah 5n + 10 O (n2) ?
Ya, karena 5n + 10 < 5n2 + 10n2 = 15n2 untuk n > 1
Jadi untuk c = 15, n0 = 1 |5n + 10| < c . |n2|
Jika L = 0, maka f(n) O(g(n)) dan g(n) O(f(n))
Jika L 0, maka f(n) O (g(n)) dan g(n) O (f(n))
Jika L = , maka f(n) O (g(n)) dan g(n) O (f(n))
• f(n) = 3n2+5n+10
g(n)=n2 merupakan order atau batas atas untuk f(n)
g(n) f(n)
misal : 3g(n)=3n2 3n2+5n+10,
Bagaimana dengan (3+1)g(n)=4n2 ….…3n2+5n+10 4 n2
dengan n10 , n0 =10 dan 3n2+5n+10 4n2, c=4
Jadi 3n2+5n+10 O(n2), karena untuk n 10 , 3n2+5n+10 4n2
Jadi untuk menyelesaikan ketidaksamaan di atas kita juga dapat menggunakan limit atau
memanfaatkan fungsi limit seperti yang sudah di contohkan di atas, sebagai berikut :
Teorema 1,
f (n) c 0 f (n) O( g (n))
lim
n g (n) f (n) O( g (n))
Penyelesaiannya, 3n 2 5n 10 5 10
lim 2
3 2 3 0 0
n n n n
0c
Jika a0,a1,…,an adalah bilangan riil dengan an0 maka f(x)=anxn+…+a1x+a0 adalah O(xn).
40
Jika diketahui order deret 1+2+3+…+n , maka dapat di tuliskan sebagai 1+2+3+…+n = ½
n2 + ½ n, sehingga ordernya adalah O(n2).
Teorema 3: Logaritma
Jika b adalah bilangan riil > 1 maka blog x adalah O(xn) untuk semua bilangan bulat n1 xn
adalah O(bx) untuk semua ilangan bulat n0 x blog x adalah O(x2) x b.
Teorema 4: Hirarki
Setiap fungsi merupakan big oh dari fungsi kanannya, 1,2log(n),…., , , , n, n(2log (n)),n ,
n2,n3,…,2n,n!,nn.
Teorema 5 : Lainnya
Perhatikan contoh berikut, nyatakan fungsi di bawah ini dalam notasi O dari :
a. n+n(2 log n)
n 3 sin n( 2 log n)
b.
1 2
n( log n) 3n 15
c. 2
Jawab :
a. N=O(n);n(n(2 log n)), sehingga O(n(n(2 log n)))=O(max {n, n(2 log n)}), karena
letak O(n) menurut teorema hirarki, lebih kiri dari n(2 log n), maka max {n, n(2
log n)}= n(2 log n), sehingga n+n(2 log n) adalah O(n(2 log n))
b. n 3 sin n( 2 log n) , karena sin n1, sehingga n 3 sin n adalah O( n 3 ),
disamping 2 log n adalah O( n ), maka n 3 sin n( 2 log n) adalah
O( n 3 , n ) =O(n2)
1 2
n( log n) 3n 15
2
41
c. adalah O(n(2 log n)) , sebab 3n adalah O(n) dan 15
1 2 2
adalah O(1), jadi n( log n) 3n 15 adalah O(max{ n( log n), n,1 }),
2
karena n(2 log n) terletak paling kanan (teorema hirarki), maka max{ n(2 log n),
1 2
n,1 }= n(2 log n), sehingga 2
n( log n) 3n 15 adalah O(n( log n)).
2
3.2.4. NOTASI OMEGA (Ω)
Definisi 2
Berdasarkan fungsi non-negatif f(n) untuk semua integer n>=0, kita katakanan bahwa f(n)
adalah Omega g(n), yang ditulis dengan f(n) = Ω(g(n)), jika terdapat suatu integer n0 dan
konstan c>0 sedemikian rupa sehingga untuk semua integer n>=n0, f(n)>=c.g(n).
Definisi ini hampir mirip dengan Notasi O, dengan perbedaan dalam perbandingan nya.
Jika dalam O, f(n)≤g(n), maka dalam omega, f(n)≥g(n). Sehingga dia merupakan kebalikan
dari big Oh, (Order) Ω(g(n))=f(n) merupakan batas bawah fungsi-fungsi f(n) ,di nyatakan
dalam kalimat matematis sebagai :
lim
f ( n)
n g ( n)
0 f ( n )O ( g ( n ))
c
f ( n ) ( g ( n ))
Contoh :
3n2+5n+10Ω(nn), tetapi 3n2+5n+10Ω(n2 log n), karena
3n 2 5n 10 3 5 10
lim lim 000 0
n n 2 log n n log n n log n n 2 log n
Perhatika fungsi berikut, f(x)=5n2-64n+256 seperti di tunjukan pada Gambar 18 di
bawah ini. Jelas sekali bahwa f(n) merupakan fungsi non-negatif untuk semua integer n≥0,
kita akan menunjukan bahwa f(n)=Ω(n2). Berdasarkan definisi 2, di atas, dalam rangka untuk
mendapatkan integer n0 dan konstam c>0 sedemikian rupa sehingga memenuhi n≥n0, f(n) ≥
c.n2. Seperti dalam big oh, kita akan berikan suatu nilai ke konstan selama terdapat suatu
integer, misal c=1, maka
42
f(n)≥ c.n2 5n2-64n+256>n2
4n2-64n+256>=0
4(n-8)2 >= 0
2
Karena (n-8) >0 untuk semua nilai n≥0 maka kita simpulkan bahwa n0=0, jadi kita
temukan fakta bahwa untuk c=1 dan n0=0, f(n)≥c.n2 untuk seluruh integer n≥n0.
f(n)=5n2-64n+256
1000
f(n)=2n2
500
f(n)=n2
0 5 10 15 20 25
n
Gambar 18. Fungsi f(n)=4n-64n+288 = Ω(n2)
3.2.5. NOTASI THETA (Θ)
Definisi 3
Untuk semua fungsi non-negatif, f(n) dan g(n), f(n) adalah theta dari g(n) jika dan hanya
jika f(n) = O(g(n)) dan f(n) = Ω(g(n)). Hal ini di notasikan dengan "f(n) = Θ(g(n))".
43
Pada dasarnya dapat di katakana bahwa fungsi , f(n) merupakan batas dari atas dan bawah dari
fungsi yang sama yaitu, g(n). Untuk lebih jelasnya perhatikan grambar 19 berikut ini
(g)
c2.g(n)
c1.g(n)
f(n)
n0
n
Gambar 19
Teorema 6
0 f (n) O( g (n)), f (n) ( g (n))
f ( n)
lim
n g ( n)
c f (n) O( g (n)) ( g (n)) ( g (n))
f (n) O( g (n)), f (n) ( g (n))
Sehingga,
f(n) (g(n)) bila dan hanya bila f(n) O (g(n) Ω (g(n)))
f(n) mempunyai order yang sama dengan g(n)
f(n) (g(n)) bila dan hanya bila g(n) (f(n)) dan f(n) berupa fungsi non rekursif
Notasi Asimtotik digunakan untuk menentukan kompleksitas suatu algoritma dengan melihat
waktu tempuh algoritma. Waktu tempuh algoritma merupakan fungsi : N → R+, Jadi
O(g(n))Ω(g(n)) Θ(g(n)) maka, f(n) Θ(g(n)) BILA DAN HANYA BILA (g(n)) Θ(g(n))
Contoh
f1(n)=10n3+5n2+17 (n3)
44
f2(n)=2n3+3n+79 (n3)
Sebenarnya dari definisi diatas kita hanya perlu mencari konstan c1 dan c2 serta n0 yang
memenuhi definisi tersebut, maka dari 2 pernyataan tersebut di atas kita dapat buktikan
sebagai berikut :
10n3f1(n)(10+5+17)n3=32n3, sehingga c1=10 dan c2= 32, maka akan di dapat sebagai
berikut , c1.n3 f1(n) c2.n, untuk semua n n0=1. Jelas terlihat 10n3f1(n) karena definisi
teori, untuk mengambil konstan pertama dari polinomial terbesar dari f1(n), dan untuk
mendapatkan konstan yang kedua kita dapat menjumlahkan selrurh konstan yang terdapat
pada f1(n) untuk di letakan pada g(n) sehingga menghasilkan 32n3 . Dengan demikian akan
menghasilkan c1.n3 f1(n) c2.n dan kita sudah dapat membuktikannya, penyelsaian untuk
pernyataan nomer 2 mirip dengan yang pertama. Contoh lain untuk memahami notasi theta
adalah sebagai berikut, apakah 2n+1 Θ(22n) ? jawabannya adalah BUKAN/TIDAK, karena
2n+1O(22n) tetapi 2n+1 Ω (22n). Sekarang perhatikan fungsi berikut.
45
3.3. RINGKASAN
Dalam bab ini kita dapat simpulkan beberapa pelajaran penting dalam rangka
memahami notasi asimtotik untuk keperluan melakukan analisa algoritma sebagai usaha
menentukan klasifikasi algoritma :
■ Terdapat 3 (tiga notasi) yaitu , dan O untuk mengklasifikasikan suatu
algoritma pada order fungsi, dengan mengabaikan constant multiplier dan
memperhatikan besar dari input size n yang cenderung ke .
■ Fungsi f (g) adalah equivalen dengan fungsi f mendekati atau mirip dengan
fungsi g.
■ Fungsi f O(g) adalah equivalen dengan fungsi f tidak lebih besar atau sama
dengan fungsi g.
■ Fungsi f (g) adalah equivalen dengan fungsi f lebih besar atau sama dengan
fungsi g
■ Estimasi waktu tempuh suatu algoritma di ekspresikan dengan menggunakan
notasi pada no 1
Atau secara lebih sistematis dapat di simpulkan sebagai berikut, diberikan suatu fungsi f
non negatif, sehingga terdapat 3 batas fungsi asimtotik yang umum sebagai berikut :
Kita katakan bahwa f(n) adalah Big-O (O) dari g(n), ditulis sebagai f(n)=O(g(n)), bila
dan hanya bila terdapat konstan positif c dan n0 sedemikian rupa sehingga,
0 f ( n) c . g ( n), n n0
Jika f(n)=O(g(n)), kita katakan bahwa g(n) merupakan batas atas (upper bound) pada
f(n).
Kita katakan bahwa f(n) adalah Big-Omega() dari g(n), ditulis sebagai f(n)
= (g(n)), bila dan hanya bila terdapat konstan positif c dan n0 sedemikian rupa
sehingga,
0 c . g ( n) f ( n), n n0
Jika f(n)= (g(n)), kita katakan bahwa g(n) merupakan batas bawah (lower bound)
pada f(n).
46
Kita katakan bahwa f(n) adalah Big-Theta () dari g(n), ditulis sebagai f(n)= (g(n)),
bila dan hanya bila terdapat konstan positif c dan n0 sedemikian rupa sehingga,
c1 . g ( n) f ( n) c 2 . g ( n), n n0
Secara ekivalen, f(n)=(g(n)), bila dan hanya bila f(n)=O(g(n)) dan f(n)=(g(n)), jika
f(n)=(g(n)) kita katakan bahwa g(n) merupakan batas ketat (upper bound) pada f(n).
Catatan : Kadang kala notasi f(n)O(g(n)) sering di pakai daripada f(n)=O(g(n))
begitu juga pada ( dan ). Hal tersebut secara esensial berarti sama dan di pakai
secara umum.
Pembuktian Batas-batas
Ada 2 (dua) cara yang umum untuk melakukan pembuktian atas batas-batas seperti
diatas. Pertama menurut definisi di atas dan kedua menggunakan pendekatan yang lebih
mudah yaitu memakai teroremaa sebagai berikut :
f ( n)
lim A
n g( n)
Maka
1. Jika A=0, maka f(n)=O(g(n)) dan f(n) (g(n)).
2. Jika A=, maka f(n)= (g(n)) dan f(n) (g(n)).
3. Jika A 0, maka f(n)= (g(n)).
Jika limit di atas tidak ada, maka teknik yang pertama di pakai (by definition). Untungnya,
dalam analisis algoritma, pendekatan di atas dapat bekerja hingga saat ini.
Sekarang kita akan melihat teorema penting dalam komputasi limit yang di sebut aturan
l’Hopital.
Teorema 2. Aturan l’Hopital.
47
Di berikan f(x) dan g(x) suatu fungsi yang dapat di turunkan (differentiable). Jika
lim f ( x ) lim g ( x ) 0 atau lim f ( x ) lim g ( x )
n n n n
Maka
f ( x) f '( x)
lim lim
n g( x ) n g' ( x )
48
Latihan Soal
49
BAB IV
KOMPLEKSITAS WAKTU DAN EFISIENSI ALGORITMA
4.1. PENDAHULUAN
Pada suatu algoritma umumnya yang di perlukan ada 3 hal adalah space, yaitu alokasi
yang bersifat statis atau dinamis , waktu tempuh, yang di dasarkan atas struktur program,
disini menyangkut pada berapa banyak langkah yang di perlukan untuk menjalankan
algoritma tersebut dan rekursif, pemakaian fungsi rekursif pada suatu algoritma. Dengan
memanfaatkan model RAM (Random Access Machine) yang sudah kita definisikan di bab
sebelumnya, kita akan menentukan waktu tempuh secara lebih rinci pada bab ini. Model RAM
membantu kita untuk menentukan waktu tempuh pada algoritma, namun demikian perlu juga
untuk mengetahui space dan pemanggilan pada fungsi rekursif pada suatu algoritma,
walaupun bukan menjadi tujuan utama kuliah ini. Semua aturan dalam RAM akan kita pakai
pada pembahasan bab ini. Tujuan utama pada bagian ini adalah menentukan pengukuran atau
perhitungan kompleksitas algoritma pada suatu fragmen kode yang di berikan,space yang di
perlukan baik pada algoritma non-rekursif maupun rekursif. Pembahasan pada fungsi non
rekursif tidak dilakukan secara mendalam pada bagian ini, dan hanya di batasi pada
penyelesaian secara trial dan error. Karena keterbatasan alokasi waktu maka pada transformasi
rekursif ke non rekursif akan di bahas pada buku yang lain dan waktu yang berbeda.
4.2. PENGUKURAN
Efisiensi untuk suatu algoritma tidak diukur dengan satuan waktu (detik, milidetik, dsb),
walaupun dalam simulasi hal tersebut dapat dilakukan, namun untuk tujuan yang lebih umum
waktu tempuh suatu algoritma sangat bergantung pada :
a) Banyaknya data problem size
b) Spesifikasi komputer Hardware (RAM, processor, dll)
c) Kompiler software
d) Tegangan listrik contoh kasusnya, pemakaian notebook menggunakan daya baterai
juga berpengaruh pada waktu tempuhnya karena kerja processor dapat dikatakan kurang
normal.
50
e) Unsur manusia. programmer
Kebergantungan tersebut sudah diatasi dengan model RAM, dan oleh karena itu perlu di
lakukan studi terhadap setidaknya waktu tempuh, penggunaan space memori, pergerakan data
dan stabilitasnya, dalam bentuk fungsi waktu T(n) yang menjadi hasil akhir pengukuran
algoritma.
51
(3) Pada algoritma sorting operasi dominannya adalah operasi “<” atau “>” operasi
yang lain seperti “” tidak dominan, karena belum tentu terjadi penukaran atau
perpindahan (contoh kasus : jika data yang diinputkan sudah dalam keadaan terurut)
(4) Pada algoritma menentukan rata-rata operasi dominannya adalah penjumlahan (+)
(5) Pada algoritma perkalian 2 matriks operasi dominannya adalah perkalian, sedangkan
operasi dominan yang keduanya (2nd dominant operation) adalah penjumlahan atau
pengurangan
(6) Pada algoritma menentukan modus operasi dominannya adalah pembandingan “<”
atau “>” yang terjadi dalam proses pengurutan, lalu diikuti dengan operasi dominan
yang keduanya (2nd dominant operation) adalah pembandingan “=” yang terjadi dalam
proses menghitung frekuensi dari masing-masing data
c) Menentukan fungsi langkah g(n)
g(n) = banyak kali operasi dominan dilakukan (dalam n)
Contohnya,
Tanpa Else
Dengan Else
Gambar 20. Perbedaan dengan else dan tanpa else algoritma min max
53
Tabel 10. Perbandingan Waktu tempuh Sekuensian dan Buble sort
n Sekuensial Bubble
10.000 580 460
20.000 1.890 1.800
30.000 4.000 4.095
40.000 6.900 7.260
50.000 10.435 11.325
100.000 36.200 45.415
Prediksi 1.000.000 3.620.000 4.541.500
(4) Pada algoritma perkalian 2 matriks g(n) =n3
N waktu tempuh
100 40
200 320
300 730
400 1.762
500 3.425
600 5.850
700 9.160
800 13.760
900 19.360
1.000 26.380
54
karena kebutuhan memory yang sebenarnya bergantung dari banyak data dan struktur datanya.
Kebutuhan memory dari suatu algoritma diukur dalam satuan problem size n. Pada
pengukuran ini jika di simulasikan secara fungsional kita mudah mendapatkan konstruksi
memori yang di hasilkan oleh suatu algoritma, bahkan kebutuhan setiap fungsi dapat di ambil
dengan mudah.
55
Gambar 22. Stabilitas Sorting
Contoh :
s=0 (a)
for i=1 to n do
s=s+i (b)
write(s) (c)
Analisis :
(1) Dari fragmen program diatas, maka dapat di analisa sebagai berikut :
(2) Bagian (a) di eksekusi 1 kali
(3) Bagian (b) merupakan suatu loop, yang didasarkan atas kenaikan harga i dari i=1
hingga i=n. Jadi statemen s=s+i akan diproses sebanyak n kali sesuai kenaikan harga i
(4) Bagian (c) akan diproses 1 kali
(5) Karena bagian (b) merupakan bagian paling yang paling sering dip roses, maka bagian
(b) merupakan operasi aktif, sedang (a) dan (c) dapat di abaikan karena bagian tersebut
tidak sering diproses.
56
(6) Bagian (b) dip roses sama dengan banyak data yang di masukan (n). Maka program
penjumlahan bilangan riil tersebut mempunyai order sebanding dengan n atau O(n).
Contoh :
for i=2 to n do
a=2*n+i*n
Analisis :
Jumlah pemrosesan a=2*n+i*n mengikuti iterasi dalam i, yaitu dari i=2 hingga i=n,
jadi sebanyak (n-2)+1=(n-1) kali. Perhatikan disini yang penting bukanlah berapa nilai
variable a (yang merupakan fungsi dari i dan n), tapi keseringan pemrosesan a. Sehingga
algoritma tadi berorder O(n)
Contoh :
for i=1 to n do
for j=1 to i do
a=n+i*j
Analisis :
• Pada i=1, j berjalan dari 1 hingga 1 sehingga a diproses 1 kali
• Pada i=2, j berjalan dari 1 hingga 2 sehingga a diproses 2 kali
• Pada i=3, j berjalan dari 1 hingga 3 sehingga a diproses 3 kali
• … dan seterusnya
• Pada i=n, j berjalan dari 1 hingga n sehingga a diproses n kali
• Secara keseluruhan A akan dip roses sebanyak (1+2+3+…+n)=
n(n 1) 1 2 1
n n
2 2 2 kali, dan algoritma tersebut mempunyai order O(n2).
57
dapat di tentukan bersama komponen lain. Namun demikian untuk keperluan latihan dan
pemahaman, penentuan kebutuhan memory dapat di spesifikasian dan di intrepretasikan
tersendiri sesuai kebutuhan kuliah.
58
a) Banyak operator yang di gunakan, asumsi 1 operator adalah 1 langkah, kecuali untuk
pangkat (^) dan modulo (%) di hitung 2 langkah
b) Kontrol langkah (sekuensial, struktur kondisi dan perulangan)
Operator logika : AND, OR, NOT, XOR dan sejenisnya dihitung 1 langkah
Operator aritmatik : +,-,*,/ di hitung 1 langkah
Operator aritmatik : ^ (pangka) dan % atau mod di hitung 2 langkah
Operator Relasional : <,>,!=,>=,<= di hitung 1 langkah
Operator Logika : And,Or, Xor dan Not di hitung 1 langkah
Contoh :
not(p and q) mempunyai langkah sebanyak 2
not(x > 0) and (y > 0) mempunyai langkah sebanyak 4
C nk (nk) C = kombinasi
Cn k
lim k C Cnk O (nk) Ω (nk)
n n
Array 1 dimensi dan akses pointer di hitung 2 langkah, sedangkan untuk 2 dmensi di hitung 4
langkah seperti di bahas pada bab 2.
4.4.2.2. SEKUENSIAL
Misal ada suatu statemen sebagai berikut,
Statemen s1 dengan t1 langkah
Statemen s2 dengan t2 langkah
Maka banyak langkah statemen gabungannya adalah t1+t2 atau
S1 banyak langkah P1
S2 banyak langkah P2
S3 banyak langkah P3
. .
Sn banyak langkah Pn
n
P
i 1
i 59
Total banyak langkah blok-blok statement tersebut adalah Si bisa berupa : assigment,
procedure call, percentage, kalang, dan sebagainya.
Contoh :
xx*y operasi 2 =2
y a * sin(x) operasi 3, proc 1, param 1 =4
read (b) proc 1,param 1 =2
write (x + y + b) proc 1, operasi 2, param 1 =4+
Banyak Langkah = 12
4.4.2.3. BRANCHING
Bentuk Umum dari kondisional adalah sebagai berikut :
if (k) s1 else s2
k = kondisi dengan banyak langkah sebesar c, tergantung ekspresi di dalamnya sedang s1,s2 =
blok statement dengan banyak langkah P1, P2. Misal :
kondisi mempunyai k langkah, s1 mempunyai p1 langkah dan s2 mempunyai p2 langkah
maka langkah terburuk adalah k+max(p1,p2), dan langkah terbaik adalah k+min(p1,p2), yang
digunakan dalam menentukan banyak langkah dalam suatu pencabangan adalah kasus
terburuk yaitu k+max(t1,t2). Contoh :
if x>0 then // c = 1
x:=x-1 // p1 = 2
y:=x+y
else
y:=x-y // p2 = 1
Analisa.
Banyak kondisi adalah 1, dengan 1 operator, sedangkan banyak langkah di bedakan atas
kondisi true, terdapat 2 langkah dan kondisi false terdapat 1 langkah, maka perhitungan dapat
di lakukan dengan menuliskan c+max(p1,p2)=1+2=3 langkah. Contoh lainnya,
input(x); // 1 langkah
y=x+5; // 1 langkah
if (x>0) then // 1 c
y:=y-5; // 2 langkah
x:=x-y;
else
x=abs(x); // 1 langkah
x=5 do{
while (x>0){ .
. .
. input(x);
input(x) }while (x>0)
}
Gambar 23. Bentuk Loop unpredictable
Pada bentuk di atas, x tidak dapat di ketahui akan di baca berapa kali. Untuk bentuk yang
seperti diatas, sangat sulit untuk di analisa, dengan demikian analisa di pastikan pada bentuk
yang sudah pasti, misal pada bentuk for loop berikut :
for (i=awal,i=akhir;i=+5){
.
input(i);
}
Nilai i hanya bisa di gunakan dalam statemen di bawah for (bersifat lokal pada kalang for)
Jadi for loop lebih mudah di analisis.
4.4.2.4.1. FOR LOOP KASUS 1
Pada bentuk loop pertama ini suatu statemen akan di kerjakan sebanyak step atau counter
pada loop yang bersifat default, yaitu di ikremen sebanyak 1 kali saja.
Counter : integer
Step : 1 = default
Pada bentuk ini statement S mempunyai banyak langkah yang tidak bergantung nilai counter.
for counter : awal to akhir for (awal;akhir;counter)
S S
61
S dieksekusi sebanyak akhir – awal +1 kali
Keterangan :
Counter ≤ Akhir , S dieksekusi sebanyak akhir – awal + 2 kali
Counter = counter + 1 , S dieksekusi sebanyak akhir – awal + 1 kali
RUMUS UMUM
Contoh :
for (x=0;x<n;x++) atau for x:=0 to n-1 do
Contoh :
Berapa banyak langkah dari
for i = 1 to n do
x : = x + 5; // 2
y : = y + x; // 2 jadi p=4
Penyelesaian :
# Langkah = (akhir – awal + 2) + (akhir – awal + 1) (p + 1)
= (n – 1 + 2) + (n – 1 + 1) (4 + 1)
= (n + 1) + (n)(3)
= n + 1 + 3n
= 4n + 1
4.4.2.4.2. FOR LOOP KASUS 2
Pada kasus kedua, loop dengan jumlah langkah counter atau step = s , dimana s dieksekusi
sebanyak akhir awal 1
s
62
n j n j
2 14 1
3 3
n j n j
2 15
3 3
n j n j
2 5. 5
3 3
n j n j
2 5. 5
3 3
n j n j
6 7 Jadi 6 7 O ( n) Pd (n) O (nd ) , P = Polinomial, d = Derajat
3 3
Bentuk loop di atas berupa nested loop, dalam bentuk ini sering terjadi bahwa nilai awal inner
loop bergantung pada besar nilai counter dari outer loop. Perlu diperhatikan juga bagian kode
yang di beri highlight abu-abu, yang menunjukan kebergantungan nilai awal inner loop pada
63
counter outer loop. Untuk menghiutng contoh di atas maka kita dapat menyelesaikan sebagai
berikut :
n
((n-1)+2)+ ((n-1)+1).1+ (3n 3i 7 )
i
n n n
2n+1+n+ 3n 3i 7
i i i
n(n 1
(3n+1+3n2-3.( )+7n).(2)
2
6n+6+6n2-3n2+3n+14n
3n2+20n+6 O(n2)
64
Latihan Soal
1. Untuk fragmen berikut, tentukan waktu tempuh dan order fungsinya.
for i= 1 to n2 do
a[i]:= x*y
for j=1 to n do
if x>y then
temp=x
x=y
y:=temp
else
x=3*y+1
2. Tulislah algoritma Sequiential Search dan buktikan bahwa algoritma tersebut berada pada
order O(n).
3. Tulislah algoritma Binary Search dan tentukan waktu tempuh serta order fungsinya.
65
BAB V
RECURSIVE CALL
66
Karena dalam terminology rekursif mengandung 3 hal yaitu :
- Nilai awal (basis) pada fungsi sebagai stoping criteria atau ekspresi non
rekursif
- Kondisi yang menyebabkan rekursif
- Ekspresi rekursif karena kondisi rekursif terpenuhi dan nilai parameternya
selalu menuju ke nilai awal/basis.
Contoh :
fak(n)
if n=0 and n=1 then fak=1 ada 3 step dalam c (non-rekursif)
else fak=n*fak(n-1) 3 step rekursif
Contoh lain
67
Contoh lagi
Procedure Bla(x,y,n)
If n0 then
Y=x+1
Write(x,y)
Else
For i=1 to n do
Y=x+y
X=x+y
Bla(x,y,n-1)
Analisis :
((n-1)+2)+((n-1)+1)(p+1)
((n-1)+2)+((n-1)+1)(2+1)
((n-1)+2)+((n-1)+1) 3
((n-1)+2)+(3(n-1)+3)
((n-1)+2)+(3n-3+3)
((n-1)+2)+3n
4n+1
Buktikan :
T(0)=3 c
T(n)=4n+1+1+T(n-1)
T(n)=T(n-1)+4n+2
Jadi
c, n 0
T ( n)
T ( n 1) 4n 2, n 1
Contoh Lain
68
T(n)=2n+c+3n+c+(T(n-1)+c)+(T(n-2)+c)+(T(n-2)+c)
T(n)=2T(n-2)+T(n-1)+5n+7c
T(n)=5n+T(n-1)+2T(n-2)+7c
Jika c=0, maka
T(n)=5n+T(n-1)+T(n-2)
Sehingga di peroleh,
2, n 1,2
T ( n)
5n T ( n 1) 2T ( n 2), n 2
69
BAB VI ALGORITMA BRUTEFORCE
70
89 45 68 90 29 34 17
17 45 68 90 29 34 89
17 29 68 90 45 34 89
17 29 34 90 45 68 89
17 29 34 45 90 68 89
17 29 34 45 68 90 89
17 29 34 45 68 89 90
Operasi dasarnya adalah melakukan perbandingan A[j] < A[min]
Waktu eksekusi bilangan adalah :
BubbleSort(A[0..n-1])
for i = 0 to n - 2 do
for j = 0 to n - 2 – i do
if A[j+1] < A[j] then
swap A[j] and A[j+1];
71
else return -1;
Algoritma dapat di tulis ulang untuk mendapatkan efisiensi dalam praktek dengan :
Dari beberapa bentuk algoritma di atas, maka kita dapat melacak cara kerja dari algoritma
string matching sebagai berikut,
73
74
Gambar 10. String Matching
75
5.5. DUA TITIK TERDEKAT
Menemukan dua titik terdekat dari himpunan titik n. Kita hanya fokus pada ruang dua dimensi
. Titik di tentukan dengan koordinat (x,y). Jarak antara dua titik Pi=(xi,yi)dan Pj=(xj,yj)
merupakan jarak Euclidean d(Pi,Pj) = sqrt( (xi-xj)2 + (yi-yj)2 )
BruteForceClosestPoints(P)
//P adalah list dari n (n >=2) titik
dmin = ∞;
for i = 1 to n-1 do
for j = i+1 to n do
d = sqrt( (xi - xj)2 + (yi - yj)2 ) ;
if d < dmin then
dmin = d; index1 = i; index2 = j;
return index1,index2;
Untuk mempercepat algoritma kita hindari sqrt! Kita dapat membandingkan nilai (xi-xj)2 +
(yi-yj)2 secara langsung, operasi dasarnya adalah:
BruteForceFaktorial(n)
Int I,fakto;
fakto=1;
76
for i = 1 to n do
fakto=fakto*i;
return fakto
BruteForceMatrik(A[n][m] B[m][n])
C[n][n];i,j,k;
for i = 1 to n do
for j = 1 to n do
C[i][j]=0;
for k = 1 to n do
C[i][j]=C[i][j]+(A[i][j]* B[i][j])
return C[i][j];
77
orang 4 7 6 9 4
Dengan melihat matrik diatas, solusinya dalah memilih satu elemen dalam tiap baris dari
seluruh elemen kolom yang berbeda dalam matrik lalu menjumlahkan total dari elemen
terkecil yang terpilih yang mungkin. Tidak ada strategi umum untuk pekerjaan ini. Kita akan
menggambarkan sebgai solusi n-touple <j1,…,jn>. Solusi ini memerlukan komputasi seluruh
permutasi dan jumlahan dari biaya/cost.
<1,2,3,4> cost = 18
<1,2,4,3> cost = 30
<1,3,2,4> cost = 24
Jumlah permutasinya adalah n!. Kita akan mengevaluasi seluruh permutasi ini dalam rangka
menemukan cost yang terkecil, order algoritma ini adalah O(n!).
(for n=4, n! = 4*3*2*1 = 24
n=5, n! = 5*4*3*2*1 = 120
n=6, n! = 6*(5!) = 720
n=7, n! = 7*(6!) =5040
n=8, n! = 8*(7!) = 40320)
Contoh :
Input :
infinity: 999
no. of cities: 4
no. of paths: 6
S D Dist
path0: 0 1 2
path1: 0 2 4
path2: 0 3 3
path3: 1 2 3
path4: 1 3 6
path5: 2 3 1
78
Proses Algoritma adalah sebagai berikut :
79
BAB VII
ALGORITMA GREEDY
7.1. PENDAHULUAN
Algoritma greedy merupakan metode yang paling populer untuk memecahkan
persoalan optimasi . Persoalan optimasi (optimization problems): persoalan yang menuntut
pencarian solusi optimum. Solusi optimum (terbaik) adalah solusi yang bernilai minimum atau
maksimum dari sekumpulan alternatif solusi yang mungkin. Elemen persoalan optimasi
adalah kendala (constraints) dan fungsi objektif(atau fungsi optiamsi) .
Solusi yang memenuhi semua kendala disebut solusi layak (feasible solution). Solusi layak
yang mengoptimumkan fungsi optimasi disebut solusi optimum.
Contoh masalah sehari-hari yang menggunakan prinsip greedy:
• Memilih beberapa jenis investasi (penanaman modal)
• Mencari jalur tersingkat dari Bandung ke Surabaya
• Memilih jurusan di Perguruan Tinggi
• Bermain kartu remi
Contoh kasus Penukaran uang, Misal pada suatu negara kita tersedia mata uang : dolar (100
sen), kuarter (25 sen), dim(10 sen), nikel(5 sen) dan peni(1 sen)
Masalah : Bagaimana menentukan algoritma untuk memeberikan uang kembalian dari suatu
pembayaran di super market dengan menggunakan sejumlah koin yang tersedia sekecil
mungkin
• Masalah : Ada seorang konsumen yan mempunyai uang kembalian sebesar 2.89 $ (289
sen) berapa coin yang harus di berikan oleh kasir ?
• Solusi : Kasir semestinya memberikan kembalian dengan 10 coin :
100 Dollar
25 Kuarter
10 Dim
5 Nikel
1 Peni
2 $ ,3 kuarter, 1 dim, 4 peni
80
• Urutan pemberian adalah di mulai dari yang terbesar
Algoritma :
Function TukarKoin(n):himp koin
/*Buat kembalian n unit dengan kemungkinan jmlh koin paling sedikit
kontan C adalah jenis koin*/
Const C={100,25,10,5,1} /*kandidat yg di pilih*/
S atau {} /* S =himp solusi*/
S0 /* s jumlah dari item S*/
While sn do
x item terbesar dr C, dengan s+xn
if tidak ada item then return “solusi tidak ada”
SS {koin bernilai x}
ss+x
Return S
81
- Fungsi obyektif, yaitu fungsi yang memaksimumkan atau meminimumkan nilai solusi
(misalnya panjang lintasan, keuntungan, dan lain-lain).
Algoritma Greedy
procedure greedy(input C: himpunan_kandidat;
output S : himpunan_solusi)
{ menentukan solusi optimum dari persoalan optimasi dengan algoritma greedy
Masukan: himpunan kandidat C
Keluaran: himpunan solusi S
}
Deklarasi
x : kandidat;
Algoritma:
S{} { inisialisasi S dengan kosong }
while (belum SOLUSI(S)) and (C {} ) do
xSELEKSI(C); { pilih sebuah kandidat dari C}
C C - {x} { elemen himpunan kandidat berkurang satu }
if LAYAK(S {x}) then
SS {x}
endif
endwhile
{SOLUSI(S) sudah diperoleh or C = {} }
algoritma greedy tidak beroperasi secara menyeluruh terhadap semua alternatif solusi yang
ada (sebagaimana pada metode exhaustive search). pemilihan fungsi SELEKSI: Mungkin
saja terdapat beberapa fungsi SELEKSI yang berbeda, sehingga kita harus memilih fungsi
yang tepat jika kita ingin algoritma bekerja dengan benar dan menghasilkan solusi yang benar-
benar optimum
82
7.3. IMPLEMENTASI AG
Implementasi Algoritma greedy banyak ragamnya, dalam modul ini yang akan di bahas
adalah Minimum Spanning Tree, yaitu Algoritma Kruskal dan Prim serta Shortest Path yaitu
algoritma Dijkstra.
Setiap garis harus menghubungkan 2 titik yang berbeda, artinya tidak boleh ada cycle,
Titik boleh tidak dihubungkan dengan garis , Garis dapat berarah atau tidak berarah , Garis
dapat mempunyai bobot / value / nilai/ weight atau tidak berbobot , Graph dapat di sajikan
secara visual melalui diagram graph atau melalui matrix keterhubungan (adjecent matrix).
Graph dapat di representasikan dengan suatu larik/array atau linked list, jika dengan
larik dapat menggunakan matrik n2, dimana ada n baris dan n kolom, Baris dan kolom
berkaitan dengan setiap vertex/garis dalam graph, Jika ada vi ke vj maka barisnya adalah vi
dan kolomnya adalah vj ,Keterhubungan (adjencent) matriknya adalah adj[vi,vj]=1 jika (vi,vj)
adalah sebuah garis dalam graph, dan lainnya 0.Contoh Matrik keterhubungan (Adjacent
matrix).
83
Gambar 12. Representasi Graph dalam Matrik keterhubungan
Outdegree adalah suatu garis yang terhubung pada suatu graph yang di representasikan
sebagai matrik keterhubungan dalam barisnya.
1 2 3 4 5 6
84
1 0 0 0 0 0 0
2 1 0 0 1 0 0
3 0 1 0 0 0 1
4 0 0 1 0 1 1
5 1 0 0 0 0 0
6 1 1 0 0 1 0
Indegree Outdegree
Entri Entri
Kolom Baris
1 3 0
2 2 2
3 1 2
4 1 3
5 2 1
6 2 3
Representasi graph dengan List adalah untuk meneglola setiap vertek dalam garis
keterhubungan dengan vertex tersebut di gambarkan sebagai :
85
Gambar 14. Representasi Graph dengan List
Masalah: Bagaimana menghitung ID dan OD suatu node dalam graph dengan representasi adj
matrik.
Solusi :
• Baik Outdegree atau Indegree, Idenya dengan menggunakan sejumlah n sebagai index
kolom dan baris dalam adj matrik dan menghitung angka/nilai 1 dalam kolom dan
baris tersebut
• Misal nilai MAX=10 dan n2 adalah matrik
Sehingga yang harus kita lakukan adalah
- membuat suatu matrik keterhubungannya dulu
- Menentukan atau menghitung indegree
- Menentukan atau menghitung outdegree
86
Algoritma :
87
7.3.3. GRAPH TIDAK BERBOBOT
Dalam grap yang ti dak mempunyai bobot, artinya pada graph tersebut vertex atau garis
tidak mempunyai nilai atau bobot. Graph ini dapat berarah maupun tidak berarah. Entri dari
graph ini kalau di representasikan sebagai suatu matrik keterhubungan adalah sebagai berikut :
Dan jika di representasikan dalam suatu matrik keterhubungan maka di sajikan seperti matrik
di bawah ini :
88
Gambar 15. Matrik Simetri
Terlihat matrik diatas berbentuk matrik simetri, artinya untuk graph tidak berarah akan
menghasilkan suatu matrik simetri, sedagnkan untuk graph berarah tidak menghasilkan matrik
simetri. Sekarang pehatikan gambar di bawah ini,
89
A B C D E
A 0 1 0 1 0
B 0 0 1 1 0
C 0 1 0 0 1
D 1 0 0 0 0
E 0 0 0 1 0
Dan jika graph berbobot tersebut tidak berarah, maka matrik yang terbentuk adalah matrik
simetri, sedang untuk graph berbobot dan berarah maka matriknya tidak simetri. Perhatikan
contoh graph di bawah ini.
90
A B C D E F
A 0 5
B 5 0 2
C 2 0 3 15
D 3 0 8
E 15 8 0 1
F 1 0
7.3.5. PATH
Path adalah kumpulan garis dan titik yang dapat menghubungkan kedua titik tsb dengan
tidak ada garis atau titik yang di ulang kecuali titik awal dan akhir, jadi awal=akhir . Path
dapat di representasikan secara flowchart dan graph, perhatikan contoh di bawah ini :
91
Berdasarkan flowchart di atas maka path atau jalur dari A ke E adalah melalui
(1,4),(1,3),(2,5) dan (2,6), sehingga ada 4 jalur yang dapat di lalui dari titik A ke titik E. Bila
di representasikan dengan suatu graph maka path dapat di ilustrasikan sebagai berikut, missal
di ketahui suatu graph tidak berarah dan tidak berbobot seperti gambar berikut :
(A,B),(B,C) dan (A,B), (B,E),(E,D),(DC) sehingga terdapat dua jalur, sedangkan untuk jJalur
dari C ke G= (tidak ada/himpunan kosong)
7.3.6. CYCLE
Adalah path dari titik awal dan titik akhir yang sama dengan melalui minimum 1 titik lainnya,
contoh dari graph sebelumnya maka terdapat 2 cycle yaitu : A-B-E-A=1 cycle dan B-D-C-
B=1 cycle
Graph yang setiap pasang titik tidak ada path yang kosong (). Contoh sebelumnya
(A,B,C,…,G) adalah graph tidak terhubung, karena G tidak terhubung.
7.3.8. TREE
Adalah graph yang tidak berarah ,terhubung ,tidak mempunyai cycle,bisa berbobot atau tidak
berbobot tidak ada jalur yang tertutup. Perhatikan contoh di bawah ini.
92
Gambar 20. Tree
Algoritma Kruskal
Input : Graph terhubung berbobot ddan tidak berarah, G =(V,E) dengan n vertek
Output: Himpunan edge T dengan MST untuk G
94
Contoh Soal, Carilah MST dari graph berikut dengan algoritma kruskal
BC 2 {B,C}
DH 3 {A,B,C} {D,F,H}
{A,B,C}
GE 3
{D,F,H}{G,E}
AE 4 {A,B,C,D,F,H,G,E}
95
Sehingga hasil akhir dari tree dari graph di atas adalah sebagai berikut :
Bagaimana jika garis CF pada graph sebelumnya bobotnya di ganti dengan 3 ?? maka akan di
peroleh tree dari graph baru seperti berikut :
#define MaxV 10
#define MaxE 20
typedef enum {FALSE,TRUE} bool;
96
return ++nvert;
}
bool isPresent(int edge[][3], int nedge, int v) {
int j;
for(j=0; j<nedge; ++j)
if(edge[j][2] < 0 && (edge[j][0] == v || edge[j][1] == v))
return TRUE;
return FALSE;
}
void kruskal(int edge[][3],int nedge)
int i,j,
tv1,tv2,tcost,
nspanedge=0,
nvert=getNVert(edge,nedge);
/*sortir edge*/
for(i=0;i<nedge-1;++i)
for(j=I;j<nedge;++j)
if(edge[i][2]>edge[j][2]){
tv1=edge[i][0];tv2=edge[i][1];tcost=edge[i][2];
edge[i][0]=edge[j][0];edge[i][1]=edge[j][1];
edge[i][2] = edge[j][2]; edge[j][0] = tv1;
edge[j][1] = tv2; edge[j][2] = tcost; }
for(j=0; j<nedge-1; ++j) {
int v1=edge[j][0];
int v2=edge[j][1];
/*cycle.*/
if(isAda(edge, nedge, v1) && isPresent(edge, nedge, v2))
printf(“ditolak:%d%d%d...\n ",edge[j][0],edge[j][1], edge[j][2]);
else {
edge[j][2] = -edge[j][2];
printf("%d %d %d.\n", edge[j][0], edge[j][1], -edge[j][2]);
if(++nspanedges == nvert-1) return; }
}
printf(“Tidak ada spanning tree utk graph.\n");
}
97
Gambar 25. Graph Persoalan Prim
Berdasarkan gambar a pada grap di atas, vertek di sebelah kiri grais putus-putus milik X dan
yang kanan milik Y. Pertama-tama pada gambar a X={1} dan Y={2,3,…,6}. Gambar b
vertek 2 di pindahkan dari Y ke X karena edge (1,2) mempunyai cost terkecil yaitu 1. Hal ini
di indikasikan dengan berpindahnya garis putus-putus sehingga 1 dan 2 menjadi milik X atau
berada di kiri. Seperti di tunjukan pada gambar b kandidat vertek yang di pindahkan dari Y ke
X adalah 3 dan 4, karena edge (1,3) mempunyai cost terkecil di antar edge yang berakir di X
dan Y, 3 di pindahkan dari Y ke X. Selanjutnya dari dua kandidat vertek 4 dan 5 dalam
gambar c, 4 di pindah karena edge (3,4) mempunyai cost terkecil. Akhirnya vertek 6 dan
kemudian 5 di pindahkan dari Y ke X seperti di tunjukan pada gambar e. Setiap kali vertek y
di gerakan dari Y ke X, adalah merupakan edge yang terhubung di dalam T dan menghasilkan
MST seperti di tunjukan pada gamabar f.
Algoritma Prim
98
(x,y) dengan bobot minimum, dimana x X dan y Y lalu di pindahkan y adri Y ke X.
Edge ini di tambahkan pada MST saat ini pada T. Langkah ini di ulang hingga Y kosong.
T{};X{1};YV{1}
While Y{}
Di berikan (x,y) bobot minimum sedemikian rupa sehingga xX dan yY
XX{y}
YY-{y}
TT{(x,y)}
Berikut ini di berikan potongan kode dalam pascal mengenai algoritma Prim :
Contoh Soal : Di ketahui suatu graph seperti di bawah ini, buatlah matrik keterhubungan dan
Tabel MST dengan algoritma Prim, lalu gambarkan tree dari graph yang di hasilkan.
Graph Asal
Sisi/garis S/garis
Langkah B
Terpilih/diambil Minimal yang dihasilkan
Algoritma Dijkstra
procedure Dijkstra;
{ Dijkstra menghitung cost shortest path dr
vertex 1 ke tiap vertex dr directed graph }
begin
(1) S := {1};
(2) for i := 2 to n do
(3) D[i] := C[1, i]; { inisialkan D }
(4) for i := 1 to n-1 do begin
(5) Pilih vertex w dlm V-S sedemikian sehingga D[w] adlh minimum;
(6) Tambahkan w ke S;
(7) for tiap vertex v dlm V-S do
(8) D[v] := min(D[v], D[w] + C[w, v])
end
end; { Dijkstra }
Contoh, diketahui graph sebagai berikut, Gunakan Algoritma Dijkstra
102
Cari Source Ke Akhir simpul, ternyata ada:
1-2,1-3,1-4,1-5
Cari jalur terpendek dari tiap-tiap simpul yang berhubungan dr source ke akhir
1-2
1-2 =50
1-3-4-2 =45, terpendek
1-5-4-2 =95
1-3
1-3 =10
1-2-3 =65, terpendek
1-2-5-4-2-3 =125
1-5-4-2-3 =110
1-4
1-3-4 =25, terpendek
1-2-5-4 =90
1-2-3-4 =80
1-5-4 =75
1-5
1-5 =45,terpendek
1-2-5 =60
1-3-4-2-5 =65
1-3-4-5 =60
Kumpulkan jalur terpendek dari masing-masing simpul yang berhubungan dr source ke akhir,
dan hasilnya adalah sebagai berikut :
Jalur Jarak
1-3 10
1-3-4 25
1-3-4-2 45
1-5 45
103
7.4.4. SHORTEST PATH : ALGORITMA KNAPSACK
Ada beberapa versi dari masalah klasik ini. Salah satunya bisa diilustrasikan sebagai berikut.
Diberikan n objek dan sebuah ransel (knapsack). Masing-masing objek i mempunyai berat wi dan vi.
Ransel tersebut bisa memuat objek maksimal seberat W. Masalah yang harus dipecahkan adalah
bagaimana mengisi ransel dengan objek yang nilai maksimal tanpa melewati batas kapasitas dari
ransel. Dalam versi ini, diasumsikan bahwa masing-masing objek dapat dibagi menjadi bagian yang
lebih kecil, sehingga kita dapat memutuskan untuk hanya membawa sebagian objek i sebanyak x 1.
Dengan demikian, algoritma untuk masalah ini dapat disusun sebagai berikut, n adalah jumlah objek
wi adalah variabel yang menyatakan berat dari objek i, vi adalah variabel yang menyatakan nilai dari
objek i, xi adalah pecahan yang menyatakan beberapa bagian dari objek i yang dimasukkan dalam
ransel. Variabel berat menyatakan jumlah berat objek yagn sudah dimasukkan dalam ransel, sedangkan
W adalah kapasitas dari ransel.
104
7.4.4.2. SECARA GREEDY
Sedangkan secara greedy permasalahan knapsack dapat di selesaikan dengan cara sebagai
berikut :
Procedure Gknapsack(P,W,x,n)
Real P(1:n),W(1:n),x(1:n),M,Isi;
Integer I,n;
X(1:1)0;
IsiM;
For i1 to n do
if W(i)>cu then exit
x(i)1
isiisi-W(i)
Repeat
if i<= n then x(i)isi/W(i)
– Inisiasi
• Untuk setiap i, set xi = 0
• Set berat = 0
– Selama berat < W lakukan
• Pilih i, yaitu objek yang paling potensial (lihat keterangan di bawah) dari objek yang
tersisa.
• Jika berat + wi ≤ maka
xi = 1
Berat = berat + wi
Jika tidak maka
xi = (W – berat) / wi
berat = W
Contoh,
Diketahui
n=3 dengan Wi(18,15,10) dan Pi(25,24,15) dan M=20, Ditanyakan : Tentukan berat tiap-
tiap barang yang dpt di muat dalam ransel dengan kapasitas M ?
105
Solusi dengan Matematis
Step 1
• Tentukan solusi feasibel yaitu 2 X n dari batas bawah dan atas, lalu hitung sesuai
kapasitas M<=20, untuk masing masing bobotnya
Step 2
PiXi
Solusi ke (X1,X2,X3) WiXi
Profit
1 (0,1,1/2) 20 31.5
2 (1,0,1/5) 20 28
3 (1,2/15,1) 20 28.2
4 (0,2/3,1) 20 31
5 (5/18,1,0) 20 30.9
6 (5/9,0,1) 20 28.8
Wi min (1,2/3,1) 20 31
Running Algorithm
107
• Di Inputkan ke algo Knapsak Greedy
X(1:n)0
Isi20
Mulai iterasi
i=1
W(i)>isi ? 15>20, tidak, maka
x(1)1, brg dpt dimuat seluruhnya dari W(1)=15
isi=20-15, kapasitas ransel berkuran mjd 5
i=2
W(2)>isi ? 5>10, ya, maka
x(2)5/10=1/2, brg dpt dimuat sebanyak ½ bagian saja dari W(2)=10
isi=5-5, kapasitas ransel habis
i=3, X(3)=0, isi=0, selesai, karena isi=0
• Menghitung Profit (P1+P2+P3)=(24.1+15.1/2+18.0)=31.5
108
BAB VIII
ALGORITMA DIVIDE AND CONQUER
8.1. DEFINISI
Metode yang lain yang di bahas adalah algoritma Divide and Conquer, dimana algoritma
ini terdiri dari 3 bagian yaitu :
109
versi lain
Procedure DNC(p,q)
Global n,A(1:n);integer m,p,q
If small (p,q) then G(p,q) else
M devide(p,q)
Combine(dnc(p,m),dnc(m+1,q))
Secara tradisional, rutin di dalam text algoritma ini terdiri dari setidaknya dua
pemanggilan rekursif yang di sebut algoritma divide dan conquer. Umumnya kita akan pecah
masalah menjadi sub masalah yang disjoint (unik/atomik), perhatikan diagaram di bawah.
110
Solusi rekursif untuk masalah dengan n banyak dan pembagian n/2 masalah untuk solusi
semua masalah dapat di berikan algoritmanya sebagai berikut :
g (n) , n n0
T (n)
2T ( n / 2) f ( n ) , n n0
8.2. RUNNING TIME DARI ALGORITMA DIVIDE DAN CONQUER
Semua algoritma divide dan conquer yang efisien akan kita lihat dengan membagi masalah
menjadi sub masalah, dimana tiap pemecahan masalah dari masalah sesungguhnya, dan
kemudian melakukan perkerjaan tambahan untuk menghitung jawaban akhirnya. Sebagai
contoh kita akan menganalisa operasi yang di lakukan dalam merge sort dengan memecah
menjadi dua sub masalah, dimana setengah masalahnya merupakan besar dari ukuran
sebenarnya dan menggunakan pekerjaan tambahan dengan memakai O(n). Sehingga
persamaan waktu tempuhnya, dengan inisial kondisi, adalah
111
T(n) = 2T(n/2) + O(n)
Dan solusi persamaan di atas berada dalam order O(n log n). Dengan menggunakan teorema
di bawah ini kita dapat menentukan waktu tempuh algoritma divide dan conquer.
Solusi persamaan T(n) = aT(n/b) + Θ(nk), dimana a 1 dan b > 1, adalah
O ( n log b a ) if a bk
T ( n ) O ( n k log) if a bk
O (n k ) if a bk
Contoh :
Rekursif conquer
112
n g(n)
2 1
4 2g(2)+2 = 4
8 2.4+2 = 10
16 2.10+2 = 22
32 2.22+2 = 46
64 2.46+2 = 94
n n−2
Misal n=4
x = 6789
y = 2476 x
z = ......... ?
Problem Size = n
Operasi Dominan = perkalian
algoritma biasa g(n) = n2 + cn → O(n2)
Solusi deengan metode DANDC adalah
113
X a b
Y c d
O(n2) tidak berubah menjadi lebih efisien, maka conquer perlu diubah
pseudo code
Begin
u ← (a+b).(c+d)
v ← ac
w← bd
z ← v.10n + (u–v−w) 10n/2 + w
End
maka g(n)= 3g( ) + cn → O(nlog 3) = O(n1,59)
114
INSERTION-SORT (A)
1 for j 2 to length[A]
2 do key A[j]
3 { Sisipkan A[j] ke dalam urutan terurut A[1 . . j - 1].}
4 ij-1
5 while i > 0 and A[i] > key
6 do A[i + 1] A[i]
7 ii-1
8 A[i + 1] key
Algoritma di atas dalam bentuk suatu prosedur dengan nama INSERTION-SORT, dengan
parameter berupa larik A[1 . . n] yang berisi urutan larik sepangjang n (length[A) yang akan di
urutkan. Perhatikan contoh berikut pada suatu larik 5,2,4,6,1,3 yang akan di urutkan:
115
Analisa Insertion Sort
116
int min, temp;
for (i = 0; i < besararray -1; i++){
min = i;
for (j = i+1; j < besararray; j++){
if (A[j] < A[min]) min = j;
}
temp = A[i]; /*pertukaran data*/
A[i] = A[min];
A[min] = temp;
}
}
Algoritma Selection Sort 2
117
Dari Inner Loop di daptkan
(akhir – awal + 2) + (akhir – awal + 1) (p + 1))
= ((n – (i+1)) + 2) + ((n – (i+1)) + 1) (2 + 1)
= ((n – (i+1)) + 2) + ((n – (i+1)) + 1) . 3
= ((n – (i+1)) + 2) + 3(n – (i+1)) + 3
= 4 (n – (i+1)) + 5
= 4n – 4i +4+5
= 4n – 4i +9
(P(i)) = Banyak Langkah dalam S = 1 + banyak langkah inner loop
= 1 + 4n – 4i +9
= 4n – 4i +10
119
berada pada order O(n2). Untuk data berukuran kecil maka algoritma ini berjalan relative
stabil sedangkan untuk data besar maka menjadi tidak stabil.
Algoritma Sequential Sort
Seq(int *x, int n){
int i,j,temp;
for (i=0;i<n-1;i++)
for (j=i+1;j<n;j++)
if (x[i]>x[j]) {
temp=x[i];
x[i]=x[j];
x[j]=temp;
}
}
Untuk data seperti di bawah ini, maka:
x= 2, 1, 6, 7, 4, 3, 2
i= 1 2 3 4 5 6 7
j= 2 3 4 5 6 7
121
Sisanya adalah larik b, yang akan di tambahkan ke c
Jelas waktu untuk melakukan merge dari dua list tersortir adalah linear, karena kebanyakan
perbandingan di lakukan sebanyak n - 1, dimana n adalah total jumlah elemen. Algoritma
mergesort di jelaskan sebagai berikut. Jika n = 1, hanya ada satu elemen yang di sortir, selain
itu , mergesort secara rekusrsif, setengah pertama dan setengah kedua. Hal ini memberikan
separoh dua larik tersortir, yang dapat di merge bersama-sama menggunakan algoritma merge
sort tadi. Sebagai contoh untuk mengurutkan empat elemen larik 24, 13, 26, 1, 2, 27, 38, 15,
kita lakukan pengurutan secara rekursif pada ke empat pertama dan teakhir dari elemen
tersebut, sehingga di dapatkan 1, 13, 24, 26, 2, 15, 27, 38. Lalu kita merge setengah pertama
dan kedua sehingga di peroleh hasil akhir 1, 2, 13, 15, 24, 26, 27, 38. Jelas masalahnya adalah
membagi (divided) kedalam masalah yang lebih kecil dan menyelesaikan secara rekursif.
Algoritma Mergesort 1 dalam c
122
if((i+l-1) < n) merge(X,i,(i+l-1),n,Y); else
while (i <= n ){Y[i] = X[i];i++; }
}
void merge(int numbers[], int temp[], int left, int mid, int right){
int i, left_end, num_elements, tmp_pos;
left_end = mid - 1;
tmp_pos = left;
num_elements = right - left + 1;
while ((left <= left_end) && (mid <= right))
{
if (numbers[left] <= numbers[mid])
{
temp[tmp_pos] = numbers[left];
tmp_pos = tmp_pos + 1;
left = left +1;
}
else
{
temp[tmp_pos] = numbers[mid];
tmp_pos = tmp_pos + 1;
mid = mid + 1;
}
}
123
while (left <= left_end)
{
temp[tmp_pos] = numbers[left];
left = left + 1;
tmp_pos = tmp_pos + 1;
}
while (mid <= right)
{
temp[tmp_pos] = numbers[mid];
mid = mid + 1;
tmp_pos = tmp_pos + 1;
}
for (i=0; i <= num_elements; i++)
{
numbers[right] = temp[right];
right = right - 1;
}
}
Analisa Merge Sort
Pada algoritma mergesort 1, tiap iterasi dalam loop while k dinaikan 1. Sehingga total
inkremen k adalah n - l + 1. Dengan demikian loop while di iterasi paling banyak n - l + 1
kali. Pernyataan if bergerak paling banyak satu elemen per iterasi. Waktu tempuhnya adalah
O(n - l + 1). Jika panjang elemen M maka waktunya O(M(n - l + 1)). Ketika M lebih besar dari
1 kita akan menggunakan array (X1, ...,Xm) dan (Xm+1, ...,Xn) sehingga di dapatkan array
tersortir baru yang berisi n - l + 1 elemen. Jadi sekarang kita tidak perlu ada tambahan space
untuk elemen n - l + 1 seperti yang di perlukan oleh array Z, dan hanya di butuhkan space
sebanyak n - l + 1. Sehingga hanya sebanyak n - l + 1 elemen saja yang di merge.
124
3. Partition atau bagi S - {v} (sisa elemen dalam S) ke dalam dua kelompok yang berbeda :
S1 = {x S - {v}| x v}, dan S2 = {x S -{v}| x v}.
4. Kembalikan { quicksort(S1) di ikuti oleh v dan di ikuti lagi oleh quicksort(S2)}.
Misal, suatu array a[1],…..,a[n] akan diurutkan dengan memilih nilai dalam array tersebut
sebagai elemen kunci. Kemudian kita pertukarkan elemen pertama dalam list tersebut dengan
elemen kunci sehingga elemen kunci berada di awal larik. Lalu kita tentukan kunci tersebut ke
tempat yang semestinya dalam list. Tempat untuk kunci tersebut dalah salah satu dari banyak
elemen di sebelah kiri kunci yang lebih kecil nilainya dari kunci tersebut dan seluruh elemen
yang lebih besar dari kunci tersebut berada di sebelah kanannya.
Untuk mendapatkan kiunci pada posisi yagn tepat, kita lakukan traversal pada list di kedua
arah tersebut dengan menggunakan index i dan j. Kita menginisialkan I ke index yang lebih
besar satu dari index elemen kunci. Jika list yang akan di urutkan mempunyai indek yang
berjalan dari m ke n, maka elemen kunci berada pada index m, dengan demikian kita
menginisialisasikan i ke (m+1). Index i di inkremen hingga kita mendapatkan elemen pada
posisi ke-i yang lebih besar dari nilai kunci. Serupa dengan hal tadi kita juga
menginisialisasikan j ke n dan mendkremen j hingga kita dapatkan elemen dengan nilai yang
kurang dari nilai kunci tersebut.
Kita kemudian periksa apakah nilai i dan j saling melewati. Jika tidak, kita pertukarkan
elemen pada posisi key (ke-m) dengan elemen posisi ke j. Hal ini membawa elemen kunci ke
posisi ke-j dan kita akan menemukan elemen tersebut di kiri yang kurang darinya dan di
sebelah kanan yang lebih besar darinya. Maka dari itu kita akan pisah list menjadi dua sublist.
Sublist yang pertama merupakan gabungan dari elemen dari posisi ke-m hingga posisi (j–1),
dan yang kedua terdiri dari elemen pada posisi ke (j+1) hingga posisi ke-n. Lalu kita ulangi
langkah tersbut untuk setiap sublist secara terpisah. Kita memilih entri dalam list sebagai
kunci, dengan mencari median atau nilai tengah seperti di sebutkan di muka dengan mudah.
Dalam C dapat di lakukan dengan,
int posisikunci(int i,j)
{
return(( i+j )/ 2);
}
Atau dengan cara random
int posisikunci(int i,j)
{
125
return(angka random dalam jangkauan i hingga j);
}
126
Gambar 36. Flowchart insert Sequential
Mula-mula, (a) penyisipan di lakukan dengan menentukan alamat data awal dan memerikasa
apakah pada alamat tersebut terdapat suatu data atau tidak, jika tidak terdapat data, maka pada
alamat tersebut data akan di isikan. (b) Sebaliknya jika berisi suatu data, maka kita cukup
menginkremen/menaikan nilai alamat sebagai index sebanyak satu kali saja, lalu kita akan
periksa apakah pada alamat tersebut sudah mencapai akhir dari ketersedian alamat atau belum,
(c) jika sudah berada di luar space yang tersedia maka algoritma berhenti , jika tidak maka
akan mengulang langkah (a), begitu seterusnya hingga langkah (c) di temukan dan algoritma
berhenti.
Dalam metode pencarian sekuensial, perbandingan yang di lakukan adalah sebanyak n kali
dalam kasus worstcase, sehingga algoritma ini berorder O(n). Jika pada index i data ketemu
maka dia berada pada O(i). Sehingga rata-rata pencariannya berada pada O(n/2). Di bawah ini
akan di sajikan flowchar pencarian secara sekuensial.
127
Gambar 37. Flowchart sekuensial search
Cara kerja algoritma ini, adalah pertama-tama (a), pencarian di awali dengan alamat awal dan
mengecek isi dari alamat tersebut mengenai keberadaan data. Apabila pada alamat tersebut
tidak berisi maka data tidak dapat di temukan dan algoritma berhenti, jika tidak (b)
makaagoritma akan memeriksa apakah pada alamat tersebut isi data sama dengan data yang di
cari, jika ya (c) maka data di temukan pada alamat tersebut dan algoritma berhenti, jika tidak
(d) kita akan memeriksa apakah data yang di cari nilainya lebih besar dengan nilai data pada
alamat tersebut atau tidak jika ya, maka (e), algoritma akan menginkremen index alamat
tersebut sebanyak 1 kali lalu kembali ke langkah (a). Namun jika ternyata nilai data tidak
memenuhi kondisi (d), maka data tidak di temukan dan algoritma berhenti. Di bawah ini akan
di berikan contoh pencarian secara sekensial.
128
Gambar 38. Gambar peta memori
Misalkan ada data dalam suatu memori seperti gambar di atas, akan di cari data bernilai 50, maka
menurut algoritma searching akan berjalan sebagai berikut :
1. Addr=0, m(addr) isi data ? Y
2. M(addr)=data ? T (15<>50)
3. M(addr)>data ? Y (50>15)
4. Addr=addr+1 (addr=1)
5. Ulangi langkah 1
Jika di jalankan maka akan memerlukan 5 langkah untuk menemukan data 50, yaitu dr
15,20,25,30 dan 50
129
8.5.2 BINARY SEARH
Pencarian secara biner atau di kenal sebagai binary search adalah merupakan pencarian
bagi dua yang masuk dalam kelompok algoritma DANDC. Ide algoritma ini cukup sederhana,
yaitu dengan memecah masalah pencarian menjadi dua, begitu seterusnya, hingga di temukan
data yang di inginkan. Pada algoritma ini dapat di representasikan dengan data linear atau
suatu tree (binary search tree). Syarat dari pencarian dalam algoritma ini adalah data sudah
harus terurut. Kita akan menelaah dari representasi data secara linear dan lalu secara non-
linear dengan memanfaatkan tree.
Misalkan di ketahui suatu data dalam larik x=x(1),x(2),x(3),…,x(n), dan kita akan mencari
data a dalam larik x tersebut sedemikian rupa sehingga apabila x[i]=a maka kita dapat ketahui
i. Secara umum rumusannya dapat di tuliskan dengan :
Algoritma akan memecah masalah (larik) menjadi 2 bagian berdasarkan nilai tengahnya, yang
di dapatkan dari nilai index akhir larik di kurangi nilai index awal larik di bagi dua. Pada hail
pembagian tersebut di dapatkan nilai index tengah (t) yang di jadikan perbandingan terhadap
data yang di cari, caranya dengan menentukan data pada alamat di t apakah lebih besar atau
lebih kecil. Jika lebih kecil maka larik atau n size problem tersebut di bagi dua lagi dengan
mengganti nilai index akhir larik menjadi nilai tengahnya, dan nilai tengah yang bari di
tentukan dengan cara yang sama seperti semula. Algoritma akan berhenti bila nilai index lebih
kecil dari nilai index awal atau lebih besar dari nilai index akhir. Dalam binary search, jumlah
perbandingan yang di perlukan untuk mencari satu elemen dalam list dalah tidak lebih dari
130
log2n, dimana n adalah ukuran list . Dengan demikian algoritma binary search mempunyai
kompleksitas waktu O(n *( log2n))
Ukuran efisiensi :
max=2log n mis n=16 maka 4 langkah
min=1
Algoritma binary search di berikan dalam bentuk notasi bahasa c dan flowchart sebagai berikut :
131
Contoh kasus:
Dengan index i= 1 2 3 4 5 6 7 8 9 10
jawab :
x= 2 7 9 12 14 20 36 76 100 125
i= 1 2 3 4 5 6 7 8 9 10
langkah 1.
lower=1 , upper=10 , t=(lower+upper) div 2 = 5 dengan x[5]=14 , Dicari a=36, sehingga
36>14,
langkah 2
karena a>x[t] 36>14, maka lower = (t+1)=6 , upper=10 ,dan t=16/2=8 dengan x[8]=76
langkah 3
karena a<x[8] 36<76, maka lower=6, upper=t-1=7, dan t=6 dengan x[6]=20
langkah 4
karena a>x[6] ,36>20, maka lower=t+1=6+1=7 , upper=7 , t=7 dengan x[7]=36 , ketemu
Jadi diperlukan 4 langkah pencarian dalan data linear dengan binary search.
132
terhadap penentuan median lebih presisi, walupun langkahnya lebih kompleks . Di bawah ini
di berikan flowchart pencarian secara interpolasi.
Contoh kasus :
Data = 5,10,20,28,40,42,50,60,80,100,1000
N 5 10 20 28 40 42 50 60 80 100 1000
Jawab :
134
Binary Search: (1)100,(2)800,(3)13,(4)40
Interpolasi Search
135
Perbandingan Metode
136
BAB IX
ALGORITMA BASIS GRAPH
Dalam struktur data kita sudah pernah melakukan kunjungan dalam suatu list, yang mana
kita lakukan secara sekuensial dengan mencetak nilai dalam list tersebut. Dalam graph,
melakukan kunjungan atau traversal berarti mengunjungi setiap vertex dalam graph (dan kita
akan memproses nilai pada vertek yang di kunjungi). Dalam kunjungan secara sekuensial dari
suatu list, kita awali dari elemen pertama dan berakhir pada saat meraih elemen terakhir
dengan cara menginkremenkan secra sekuensial index dalam list. Pada bagian ini hanya di
bahas dua kunjungan dalam suatu graph yaitu Depth First Search atau DFS dan Breadth First
Search atau BFS.
Gambar 42. Matrik Keterhubungan dalam graph berarah dan tidak berarah
Representasi Larik
138
9.1.2. MEMBUAT MATRIK KETERHUBUNGAN
Untuk menjalankan algoritma traversal ini, terlebih dahulu kita akan sajikan pembuatan
matrik keterhubungan. Potongan kode di bawah ini merupakan salah satu cara untuk membuat
matrik keterhubungan.
Selanjutnya algoritma DFS di sajikan untuk melakukan traversal pada representasi larik,
secara rekursif.
Dengan menggunakan algoritma DFS di atas di dapatkan keluaran dari node yang di kunjungi
adalah : 0 1 2 6 8 5 3 4 7
139
Karena ada matrik 9X9, maka parameter pertama dari algoritma dfs adalah index dari matrik
tersebut (mulai 0-9), lalu parameter kedua adalah stack yang di pakai untuk menampung node
yang di kunjungi, lalu input matriknya sebagai parameter ke tiga dan terakhir adalah besar
matrik (9), jadi ada sembilan langkah untuk mneghasilkan output pada matrik di atas :
for(i=0; i<n; i++)
if(visited[i] ==0)
dfs(i,visited,mat,n);
140
1 (3,1) T
0 (3,2) F
0 (3,3) F
1 (3,4) T 4
8 4 1 (4,0) T
0 (4,1) F
0 (4,2) F
1 (4,3) T
0 (4,4) F
0 (4,5) F
0 (4,6) F
0 (4,7) F
0 (4,8) F
1 (3,4) T
1 (3,5) T
0 (3,6) F
0 (3,7) F
0 (3,8) F
1 (5,3) T
0 (5,4) F
0 (5,5) F
0 (5,6) F
0 (5,7) F
1 (5,8) T
1 (8,5) T
1 (8,6) T
0 (8,7) F
0 (8,8) F
1 (6,8) T
1 (2,6) T
0 (2,7) F
0 (2,8) F
1 (1,2) T
1 (1,3) T
0 (1,4) F
0 (1,5) F
0 (1,6) F
0 (1,7) F
0 (1,8) F
0 (0,0) F
1 (0,1) T
0 (0,2) F
0 (0,3) F
1 (0,4) T
0 (0,5) F
0 (0,6) F
0 (0,7) F
0 (0,8) F
9 7 0 (7,0) F 7
141
0 (7,1) F
0 (7,2) F
0 (7,3) F
0 (7,4) F
0 (7,5) F
1 (7,6) T
0 (7,7) F
1 (7,8) T Selesai
1. Kunjungi simpul v,
2. Kunjungi semua simpul yang bertetangga dengan simpul v terlebih dahulu.
3. Kunjungi simpul yang belum dikunjungi dan bertetangga dengan simpul-
simpul yang tadi dikunjungi, demikian seterusnya.
Jika graf berbentuk pohor berakar, maka semua simpul pada aras d dikunjungi lebih dahulu
sebelum simpul-simpul pada aras d + 1. Pada umumnya graf di representasikan baik secara array
ataupun list Dalam kuliah ini menggunakan Link LIST , dalam hal ini queue :
struct node {
int data;
struct node *link;
};
Algoritma BFS secara umum dalam psuedocode :
142
Contoh : perhatikan urutan langkah yang menggambarkan jalanya algoritma BFS di bawah
ini, root adalah s.
Step 1.
Step 2
Step 3
Step 4
143
Step 5
Step 6
Step 7
Step 8
144
Step 9
Awal vertex (node) adalah S, Edge hitam solid= edge yang di temukan, Edge abu-abu adalah
error edge (karena tidak ada hubungan pd vertex tsb dg ancestornya). Running time algoritma
ini adalah O(V+E).
Dari Gambaran contoh di atas, maka kita dapat memanfaatkan algoritma ini untuk beberapa
hal yang berkaitan dengan Graph di antaranya adalah :
Di bawah ini di berikan potongan fungsi penting dalam algoritma BFS sebagi bekal untuk
lebih mendalami dan mengimplementasikannya dalam suatu aplikasi, misal MAZE problem.
Prosedur buildadjm, berguna untuk membentu suatu matrik keterhubungan, sebagai
representasi dari graph.
void buildadjm(int adj[][MAX], int n) {
int i,j;
printf("Masukan Matrik keterhubungan\n",i,j);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&adj[i][j]);
}
Fungsi addqueue merupakan fungsi utilitas yang di gunakan untuk menyimpan informasi dari
node dalam graph yang dikunjungi,
145
struct node *addqueue(struct node *p,int val) {
struct node *temp;
if(p == NULL) {
p = (struct node *) malloc(sizeof(struct node));
/* insert node pertama(root)*/
if(p == NULL) {
printf("Alokasi Gagal\n"); exit(0);
}
p->data = val; p->link=NULL;
} else {
temp= p;
while(temp->link != NULL) {
temp = temp->link;
}
temp->link= (struct node*)malloc(sizeof(struct node));
temp = temp->link;
if(temp == NULL){
printf("Cannot allocate\n"); exit(0);
}
temp->data = val; temp->link = NULL;
}
return(p);
}
Fungsi deleteq merupakan fungsi utilitas yang di gunakan untuk melakukan penghapusan
informasi dari node dalam graph yang sudah dikunjungi,
Prosedur utama dari algoritma BFS, yang memanfaatkan fungsi dan prosedur utilitas di atas
secara lengkap di sajikan di bawah ini.
146
void
bfs(int adj[][MAX],int x,int visited[], int n, struct node **p){
int y,j,k;
*p = addqueue(*p,x);
do{
*p = deleteq(*p,&y);
if(visited[y] == 0){
printf("\nnode visited = %d\t",y);
visited[y] = 1;
for(j=0;j<n;j++)
if((adj[y][j] ==1) && (visited[j] == 0))
*p = addqueue(*p,j);
}
}while((*p)!= NULL);
}
Contoh aplikasi , jika di berikan matrik 9X9 sebagai representasi dari suatu graph sebagai
berikut di bawah ini gambar a maka graph yang terbentuk secara grafik adalah seperti gambar
b dan hasil traversal dari algoritma di berikan pada gambar c
a b c
Awal simpul adalah V1, dari graf G di bawah dan kunjungan BFS menghasilkan :
v1,v2,v5,v3,v4,v7,v6,v8,v9
147
Gambar 46. Graph BFS
Ide dasar dari algoritma ini adalah, akan mencari state yang lebih baik dari state saat
ini, artinya algoritma ini akan memilih langkah selanjutnya pada setiap titik atau node yang
muncul untuk di tempatkan pada tujuan yang terdekat (dengan demikian merupakan jarak
terjauh dari posisi saat ini). Misal kita dari kota A akan menuju ke kota D, dimana kita dapat
melalui 2 buah kota lainnya yaitu B dan C. Kita harus dapat menentukan apakah kota B dan
C ada yang lebih dekat dengan D daripada kota A.
Dalam tiap langkahnya hill climibing akan selalu membuat state selanjutnya menjadi best
successor dari state saat ini, dan akan kita melangkah hanya jika successor-nya lebih baik dari
state saat ini. Algoritma dapat di gambarkan sebagai berikut :
1. Mulai dengan state awal = initial-state.
2. Hingga state awal = state tujuan ATAU jika tidak ada perubahan pada state awal maka :
148
1. Ambil successor state awal tersebut dan gunakan fungsi evaluasi untuk mencatat
nilai/score pada tiap successor.
2. Jika salah satu successor memiliki score yang lebih baik dari state awal-nya maka
set state awal baru dengan successor yang memiliki score terbaik.
Algoritma ini akan berhenti apablia tidak ada suksesor pada state awal yang lebih baik dari
state awal tersebut.
Contoh :
149
Gambar 47. Graph TSP
Idenya adalah bagaimana seorang sales akan mengunjungi seluruh kota dalam area tersebut
tanpa melakukan kunjungan pada kota yang sama sebanyak 2 kali (kecuali kota pertama) ,
setelah mengunjugi seluruh kota, maka salesman akan kembali ke kota pertama. Tujuan dari
TSP ini adalah menemukan rute optimal, yang membunyai cost terkecil, jarak terkecil, cepat
dan sebagainya.
150
10.5. A* (A-START)
Dari bentuk traversal sederhana seperti di terangkan di atas, best first search merupakan
salah satu teknik yang berguna, tetapi tidak memperhitungkan cost dari path sejauh ini saat
memilih node selanjutnya. Jadi, kita akan menemukan solusi tetapi bukan merupakan solusi
yang bagus. Ada varian dari best first search yang di kenal dengan A* yaitu metode pencarian
solusi dengan total minimal panjang atau cost dari solusi path. Algoritma ini
mengkombinasikan kelebihan dari breadth first search, dimana shortest path dapat di temukan
pertama, dan dengan kelebihan dari best first search, dimana node yang kita duga adalah yang
paling dekat ke solusi yang akan di eksplorasi ekmudian.
Score algoritma A* yang di assign ke node merupakan kombinasi dari cost path dan
cost solusi yang di estimasikan. Hal ini secara normal di ekspresikan dengan fungsi evaluasi f,
yang melibatkan jumlahan nilai yang di kembalikan oleh 2 fungsi g dan h, g mengembalikan
cost dari path (dari initial state) ke node yang di cari, dan h mengembalikan sisa cost yang di
estimasikan ke goal state:
f(Node) = g(Node) + h(Node)
Algoritma A* mencari dengan cara yang sama dengan best first algorithm, tetapi kita akan
menggunakan sedikit fungsi evaluasi yang agak kompleks. (Node terbaik yang kita cari adalah
yang memiliki score atau cost terendah).
function A*(start,goal)
{* Himpunan node yang akan di evaluasi.*}
closedset :=
{* himpunan node tentative yang akan dievaluasi.*}
openset := {initial node}
{* Jarak dari start pada optimal path.*}
g_score[start] := 0
h_score[start] := heuristic_estimate_of_distance(start, goal)
{* Mengestimasikan total distance dari start ke goal lewat y.*}
f_score[start] := h_score[start]
151
while openset
x := node dalam openset yg bernilai terendah dalam f_score[]
if x = goal
return reconstruct_path(came_from,goal)
remove x from openset
add x to closedset
foreach y in neighbor_nodes(x)
if y in closedset
continue
tentative_g_score := g_score[x] + dist_between(x,y)
if y not in openset
add y to openset
tentative_is_better := true
elseif tentative_g_score < g_score[y]
tentative_is_better := true
else
tentative_is_better := false
if tentative_is_better = true
came_from[y] := x
g_score[y] := tentative_g_score
h_score[y] := heuristic_estimate_of_distance(y, goal)
f_score[y] := g_score[y] + h_score[y]
return failure
function reconstruct_path(came_from,current_node)
if came_from[current_node] is set
p = reconstruct_path(came_from,came_from[current_node])
return (p + current_node)
else
return the empty path
10.6. TERMINOLOGY
Suatu node adalah state dalam dunia problem yang dapat di cari di dalamnya. Pada
pathfinding, suatu node hanya berupa koordinat 2d. Contoh misal pada 8-puzzle node
merupakan sluruh posisi pada kotak dalam papan. Selanjutnya seluruh node akan di atur
dalam aturan graph dimana terdapat suatu edge yang menghubungkan antar node tersebut
yang dapat mewakili untuk penyelesaian masalah yang di hadapi. Dalam diagram 8-puzzle
edges di tunjukan sebagai garis biru, seperti tampak pada gambar di bawah. Ruang Status
(State space), adalah penyelesaian masalah yang di awali dengan start state, dan kemudian
untuk setiap node kita akan mengekspansi seluruh node dalam graph dengan mengaplikasikan
seluruh kemungkinan gerakan yang dapat di buat di setiap titiknya.
152
Contoh Implementasi Algoritma A* pada 8 puzlle
153
BAB X
BACKTRACKING
154
10.4.2. SOLVING MAZE
Diberikan suatu maze, tentukan jalur dari awal hingga akhir, pada tiap interseksi (cabang),
kita harus menentukan pilihan antara 3 atau lebih sedikit keputusan yang harus di ambil :
Terus lurus, Kekiri dan Kekanan. Anda tidak punya cukup informasi untuk memilih secara
benar, tiap pilihan mengawali himpunan pilihan lainnya. Satu atau lebih ururtan pilihan
mungkin (mungkin tidak) menemukan solusi. Misal labirin (maze), di tandai dengan X sebagai
tembok yang tidak dapat di lewati, I adalah start node awal pencarian dan O adalah akhir
pencarian, dan @ adalah jalan yang di temukan.
Input Maze Valid
XXXXXXXXXXXXXXXIXXX XXXXXXXXXXXXXXXIXXX
X X X@@@@@@@@@@@@@@@ X
X XXXXXXXXXXXXXXXXX X@XXXXXXXXXXXXXXXXX
X X X X@@@@@@@@@@@ X X
X XXX XXXXX@X X X X
X XXX XXXXX X X X X
X X X X@X X X X
X XX XXXXX X X X XXX X@X X X X
X X X XXX X X X X X X X X X@X X X
XXX XX XX XXXXXXXXXXXOXXXXXXX
XXXXXXXXXXXOXXXXXXX
XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX
XX X X X X X X
X X XXXX XXX XXXXXXX X X XXXX XXX XXXXXXX
XXX X X X X@@@@@@@ X
X X X XXXXX XXX X XX X X X@XXXXX@XXX X XX
X XXX X X X X X XX X XXX@X X@X X X XX
I X X X XXXXXX I@@@@@X X@X XXXXXX
X XXXXX X X X X XXXXX X X@@@@@@@@X
X X X X XX O X X X X XX@O
XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX
Input Maze invalid (maze3)
XXXXXXXXXIXXXXXXXXX XXXXXXXXXIXXXXXXXXX
X X XX XX X X X X XX XX X X
XX X X XX X X X X X X
X XXXXX X X XXXXX X X XXXXX X X XXXXX X
X O X X O X
X XXXXX X X XXXXX X X XXXXX X X XXXXX X
XX X X XX X X X X X X
X X XX XX X X
X X XX XX X X XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
Gambar 49. Labirin
155
10.4.3. PEWARNAAN PETA
Anda di harapkan untuk mewarnai peta dengan tidak lebih dari 4 warna, misal, merah,
kuning, hijau dan biru. Negara yang berdekatan harus memiliki warna yang berbeda dan kita
tidak cukup memiliki informasi untuk menentukan warna. Tiap pilihan mengawali himpunan
pilihan lainnya, Satu atau lebih urutan dari pilihan mungkin (mungkin tidak) memiliki solusi.
V1 V2
V4 V3
V1 warna1
V2 warna2
V3 warna3
V4 warna4
156
Ada 6 solusi untuk 3 coloring problem, tetapi 6 solusi tersebut hanya berada dalam cara
permutasi warna, misal solusi lainnya adalah, v1 dengan color2 dan v4 dengan color1 dan v3
dengan color3. Implementasi dari pewarnaan graph adalah dalam map coloring, atau sering di
sebut planar graph, seprti terlihat pada gambar berikut.
V2
V1
V3
V4
V5
V V
1 2
V V
4 3
V
5
Input : Nilai integer positif n dan m serta graph tak berarah yang mengandung n vertek,
graph di wakili dengan nXn array W, dimana W[j,i] adalah bernilai true jika ada edge antara vi
dan vj dan lainya false.
157
procedure m_coloring(i:index);
var
color:integer;
begin
if promising(i) then
begin
if i=n then
write(vcolor[i] hingga vcolor[n])
else
begin
for color:=1 to m do
begin
vcolor[i+1]:=color; {cari tiap warna utk vertek}
{selanjutnya}
m_coloring(i+1);
end;
end;
end;
end;
function promising(i:index):booolean;
var
j:index;
begin
promising:=true;
j:=I;
while j<I and promising do {cek keterhubungan}
begin
if w[I,j] and vcolor[i]=vcolor[j] then {vertek berwarna}
promising:=false
j:=j+1
end;
end;
n,m,w dan vcolor bukanlah input pada routine tersebut, dalam implementasi algoritma, rutin
di definisikan secara local dimana n,m dan w sebagai input sedang vcolor di definisikan secara
local, pemanggilan ruting misalnya m_coloring(0), akan mengeksekusi :
2m n 1 1 n
1 m m ... m
m 1
158
10.4.4. SOLVING PUZZLE
Dalam puzzle ini, seluruh lobang kecuali satu terisi dengan warna putih. Kita dapat
melompati lobang tersebut dan lobang yang di lompati akan di hilangkan warnanya (jika
lobang yang di lompati berwarna hitam akan menjadi putih) . Lobang akan dihilangkan
seluruhnya kecuali yang terakhir. Kita tidak punya cukup informasi untuk melompat secara
benar, tiap pilihan mengawali himpunan pilihan lainnya, Satu atau lebih urutan dari pilihan
mungkin (mungkin tidak) memiliki solusi.
1. Blank Up
2. Blank Up
3. Blank Left
4. Blank Down
5. Blank Right
160
Gambar 55. Queen Problem (lanjutan)
Berapa jumlah maximum queen yang dapat di tempatkan pada papan catur berukuran sedemikian
rupa sehingga tidak ada 2 queen yang saling menyerang?. Jawabannya adalah queen, Namun ada
berapa kemungkinan n queen tersebut dapat di letakan pada papan, yang memenuhi ketentuan seperti
di atas ? , Berapa jumlah minimumnya ??
Temukan jumlah maximum dari peluncur (bishops) yang dapat di tempatkan pada papan
sedemikian rupa sehingga mereka tidak saling dalam posisi menyerang. Jawabannya
161
adalah , di berikan urutan 2, 4, 6, 8, ... (bilangan genap) untuk , 3, .... Satu solusi
maximal untuk adalah seperti di ilustrasikan di atas. Jumlah perbedaan maksimal dari
pangaturan maksimal untuk , 2, ... peluncur adalah 1, 4, 26, 260, 3368, .... Jumlah rotasi
dan refleksi dari solusi yang berbeda pada papan untuk adalah
(1)
Untuk . Atau
(2)
Dimana adalah fungsi floor, dengan , 2, ... as 1, 1, 2, 3, 6, 10, 20, 36, ...
(1)
Untuk kotak ganda 1, 1, 4, 4, 9, 9, 16, 16, ... dapat di generate dengan fungsi
(1)
Jumlah minimal knight yang di perlukan untuk menduduki atau menyerang pada setiap papan
adalah 1, 4, 4, 4, 5, 8, 10, .... Jumlah solusi adalah 1, 1, 2, 3, 8, 22, 3, ... .
Dimana koefisien memberikan jumlah cara tidak saling serang yang dapat di
tempatkan pada papan .
Jumlah rotasi dan refleksi yang tidak equivalen dalam menempatkan beteng yang tidak
saling menyerang pada papan adalah 1, 2, 7, 23, 115, 694, ...
Dari beberapa contoh di atas , kita dapat menyimpulkan bahwa hasil dari metode
tersebut adalah suatu vector yang berisi Artinya bahwa kita harus mendkodekan solusi
kedalam suatu vector. Selain itu tugas kita juga harus mengidentifikasi sedertan elemen
sumber dari mana kita akan membangun jalur kemungkinan dalam suatu tree, atau hanya
membuat vector sederhana dimana kita akan bergerak maju dan mencoba untuk
mengkombinasikan elemen dalam suatu array.
165
Gambar 64. Disain Stack Array N queen
Diagram di atas akan masuk akal jika kita datang pada vector selanjutnya. Diagram di atas
merupakan suatu "Puzzle of N Queens" pada papan catur 4x4. Seperti terlihat solusi vector X[
] keliahatan berkelakuan mirip dengan stack, kita akan push dan pop elemen ked an dari stack
tersebu. Kita akan mulai dari root dan mengunjungi tiap node anaknya, dari node tersebut kita
akan analisa apakah ada kandidat solusi yang potensial jika ada, kita akan push ke stack dan
jika tidak ada, akan kita gerakan naik satu level, begitu seterusnya, terakhir jika tidak ada
solusi pada level tersebut, kita pop dan mencari alternative lainnya.
168
Gambar 65. 4 Queen Problem
Angka 2 4 1 3 berarti bahwa nilai vectornya adalah X[1] = 2; X[2] = 4; X[3] = 1; X[4] = 3,
yang berarti ratu pertama di letakan pada posisi (1,2), kedua di (2,4), ketiga di (3,1), dan
terakhir di (4,3). Hal yang sama berlaku pada kandidat solusi yang kedua. Secara visual,
dalam tree, maka dapat di gambarkan sebagai berikut, perhatikan bahwa node awal (root)
adalah kosong.
16 kombinasi
169
Daftar Pustaka
Handbook of Algorithms and Data Structures In Pascal and C , Second Edition , G.H. Gonnet
ETH, Zurich, ADDISON -WESLEY PUBLISHING COMPANY 1991.
Introduction to Algorithms, Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest,
McGraw-Hill 1990.
Data Structures and Algorithm Analysis in C, Mark Allen Weiss,The Benjamin/Cummings
Publishing Co., Inc. All rights reserved 1993.
Fundamental Of Algorithmic,Gilles Brassard dan Paul Beatly, Prentice Hall Engelwood Cliffs,
New Jersey, 1996
Algorithms Design Techniques And Analysis, M.H. Alsuewalyel,Publishing House Of
Electronic Industry, 2002.
The Analysis Of Algorithms, Paul Walton Purdom, CBS Publishing Madison Avenue New
York, 1985
A Programmer’s Companion to Algorithm Analysis, Leiss, Ernst L., Taylor & Francis Group,
LLC,2006
Data Structures, Algorithms And Software Principles in C, Thomas A Standish,Addison
Wesley, 1995,California
The Art of Computer Programming, Vol 1,2,3,Donad E Knuth, Addison Wesley,
The C Programming Laguage, Second Edition, rian W Kernighan and Dennis M Ritchie,
Pretice Hall, Englewood Cliffs, N.J, 1988.
The Design And Analysis of Computer Algorithm, Alfred V Aho, John E. Hopcroft and Jeffery
D Ullman, Addison Wesley, 1974.
Data Structures and Algorithms, Alfred V. Aho, Bell Laboratories, Murray Hill, New Jersey
John E. Hopcroft, Cornell University, Ithaca, New York, Jeffrey D. Ullman,
Stanford University, Stanford, California,1999
Fundamentals of Data Structures, Ellis Horowitz and Sartaj Sahni, 1999
Data Structure And Algorithms In C++, Adam Drozdek, Thomson Learning, 2001.
Matematika Diskrit, Jong Jek Siang, Andi Offset,Yogyakarta, 2002
Matematika Diskrit, Rinaldi Munir, Irformatika, Bandung, 2002
Diktat Kuliah Strategi Algoritmik, Rinaldi Munir, 2007
170