Anda di halaman 1dari 16

ALGORITMA

BRUTE FORCE
a. Definisi Algoritma Brute force
Brute force : pendekatan yang lempang (straightforward) untuk
memecahkan suatu masalah. Biasanya didasarkan pada:
 pernyataan masalah (problem statement)
 definisi konsep yang dilibatkan. Algoritma brute force memecahkan
masalah dengan sangat sederhana, langsung, jelas (obvious way).
Algoritma brute force merupakan algoritma pencocokan string yang
ditulis tanpa memikirkan peningkatan performa. Algoritma ini sangat
jarang dipakai dalam praktik, namun berguna dalam studi
pembanding dan studi - studi lainnya.

b. Karakteristik Algoritma Brute Force


 Algoritma brute force sebenarnya bukanlah algoritma yang “cerdas”
dan mangkus (efisien), karena ia membutuhkan jumlah langkah yang
besar / banyak dalam penyelesaiannya dan tentu saja membutuhkan
waktu yang berbanding lurus dengan jumlah langkah
penyelesaiannya. Kadang – kadang algoritma brute force disebut
juga algoritma naif (naïve algorithm).
 Algoritma brute force seringkali merupakan pilihan yang kurang
disukai karena ketidakmangkusannya itu, tapi kalau mencari pola2
dasar, keteraturan, atau trik-trik khusus, biasanya dapat membantu
untuk menemukan algoritma yang lebih cerdas dan lebih mangkus
lagi.
 Untuk persoalan2 yang kecil, kesederhanaan brute force lebih
diperhitungkan daripada ketidakmangkusannya. Algoritma brute
force sering digunakan sebagai basis bila membandingkan beberapa
alternatif algoritma yang mangkus.
 Meskipun brute force bukan merupakan teknik pemecahan masalah
yang mangkus, namun teknik brute force dapat diterapkan pada
sebagian besar persoalan. Bayangkan, sangat sulit menemukan
masalah yang tidak dapat dipecahkan dengan teknik brute force, tapi
ada masalah yang hanya dapat dipecahkan secara brute force.
 Algoritma brute force umumnya tidak “cerdas” dan tidak mangkus,
karena ia membutuhkan jumlah langkah yang besar dalam
penyelesaiannya. Kadang-kadang algoritma brute force disebut juga
algoritma naif (naïve algorithm).
 Algoritma brute force seringkali merupakan pilihan yang kurang
disukai karena ketidakmangkusannya itu, tetapi dengan mencari
pola-pola yang mendasar, keteraturan, atau trik-trik khusus, biasanya
akan membantu kita menemukan algoritma yang lebih cerdas dan
lebih mangkus.
 Untuk masalah yang ukurannya kecil, kesederhanaan brute force
biasanya lebih diperhitungkan daripada ketidakmangkusannya
 Algoritma brute force sering digunakan sebagai basis bila
membandingkan beberapa alternatif algoritma yang mangkus.
 Algoritma brute force seringkali lebih mudah diimplementasikan
daripada algoritma yang lebih canggih, dan karena
kesederhanaannya, kadang-kadang algoritma brute force dapat lebih
mangkus (ditinjau dari segi implementasi).

c. Cara kerja
Secara sistematis, langkah-langkah yang dilakukan algoritma brute force
pada saat mencocokkan string adalah:
1. Algoritma brute force mulai mencocokkan pattern pada awal teks.
2. Dari kiri ke kanan, algoritma ini akan mencocokkan karakter per
karakter pattern dengan karakter di teks yang bersesuaian, sampai
salah satu kondisi berikut dipenuhi:
 Karakter di pattern dan di teks yang dibandingkan tidak cocok
(mismatch).
 Semua karakter di pattern cocok. Kemudian algoritma akan
memberitahukan penemuan di posisi ini.
 Algoritma kemudian terus menggeser pattern sebesar satu ke
kanan, dan mengulangi langkah ke-2 sampai pattern berada di
ujung teks.
Berikut adalah Algoritma brute force yang sedang bekerja mencari string:

Pseudocode
Pseudocode algoritma brute force ini:

procedure BruteForceSearch(
input m, n : integer,
input P : array[0..n-1] of char,
input T : array[0..m-1] of char,
output ketemu : array[0..m-1] of boolean
)

Deklarasi:
i, j: integer

Algoritma:
for (i:=0 to m-n) do
j:=0
while (j < n and T[i+j] = P[j]) do
j:=j+1
endwhile
if(j >= n) then
ketemu[i]:=true;
endif
endfor

Jadi secara keselurhuan cara kerjanya yaitu:

 Enumerasi (list) setiap solusi yang mungkin dengan cara yang sistematis.
 Evaluasi setiap kemungkinan solusi “satu per satu” dan simpan solusi
terbaik yang ditemukan sampai sejauh ini (the best solusi found so far).
 Bila pencarian solusi berakhir, umumkan solusi terbaik (the winner).

Contoh-contoh algoritma Brute Force:

1) Contoh-contoh Brute Force


Menghitung an (a > 0, n adalah bilangan bulat tak-negatif)

an = a x a x … x a (n kali) , jika n > 0


= 1 , jika n = 0

Algoritma: kalikan 1 dengan a sebanyak n kali

2) Menghitung n! (n bilangan bulat tak-negatif)


n! = 1 × 2 × 3 × … × n , jika n > 0
= 1 , jika n = 0
Algoritma: kalikan n buah bilangan, yaitu 1, 2, 3, …, n, bersama-sama

3) Mengalikan dua buah matrik yang berukuran n × n.


 Misalkan C = A × B dan elemen-elemen matrik dinyatakan sebagai cij,
aij, dan bij
 Algoritma: hitung setiap elemen hasil perkalian satu per satu, dengan
cara mengalikan dua vektor yang panjangnya n.

4) Menemukan semua faktor dari bilangan bulat n selain dari 1 dan n itu sendiri.
 Definisi : Bilangan bulat a adalah faktor dari bilangan bulat b jika a habis
membagi b.

5) Mencari elemen terbesar (atau terkecil)


Persoalan: Diberikan sebuah himpunan yang beranggotakan n buah bilangan
bulat. Bilangan – bilangan bulat tersebut dinyatakan sebagai a1, a2, …, an.
Carilah elemen terbesar di dalam himpunan tersebut
6) Sequential Search
Persoalan : Diberikan n buah bilangan bulat yang dinyatakan sebagai a1, a2,
…, an. Carilah apakah x terdapat di dalam himpunan bilangan bulat tersebut.
Jika x ditemukan, maka lokasi (indeks) elemen yang bernilai x disimpan di
dalam peubah idx. Jika x tidak terdapat di dalam himpunan tersebut, maka idx
diisi dengan nilai 0.

7) Bubble Sort
 Apa metode yang paling lempang dalam memecahkan masalah
pengurutan? Jawabnya adalah algoritma pengurutan bubble sort.
 Algoritma bubble sort mengimplementasikan teknik brute force dengan
jelas sekali.

8) Uji keprimaan
Persoalan: Diberikan sebuah bilangan bilangan bulat positif. Ujilah apakah
bilangan tersebut merupakan bilangan prima atau bukan.

9) Menghitung nilai polinom secara brute force


Persoalan: Hitung nilai polinom
p(x) = anxn + an-1xn-1 + … + a1x + a0
pada titik x = x0.

ALGORITMA
GREEDY
Algoritma greedy merupakan metode yang paling populer untuk
memecahkan persoalan optimasi. Greedy sendiri diambil dari bahasa inggris
yang artinya rakus, tamak atau serakah .Prinsip algoritma greedy adalah:
“take what you can get now!”.

Algoritma greedy merupakan metode yang paling populer untuk


memecahkan persoalan optimasi. Persoalan optimasi (optimization
problems): persoalan mencari solusi optimum.

Hanya ada dua macam persoalan optimasi:

1. Maksimasi (maximization)

2. Minimasi (minimization)

Algoritma greedy adalah algoritma yang memecahkan masalah langkah per


langkah.

Pada setiap langkah:

a. mengambil pilihan yang terbaik yang dapat diperoleh pada saat itu
tanpa memperhatikan konsekuensi ke depan (prinsip “take what you
can get now!”)
b. berharap bahwa dengan memilih optimum lokal pada setiap langkah
akan berakhir dengan optimum global.

o Tinjau masalah penukaran uang:

Strategi greedy: Pada setiap langkah, pilihlah koin dengan nilai terbesar
dari himpunan koin yang tersisa.

Misal: A = 32, koin yang tersedia: 1, 5, 10, dan 25

Langkah 1: pilih 1 buah koin 25 (Total = 25)


Langkah 2: pilih 1 buah koin 5 (Total = 25 + 5 = 30)

Langkah 3: pilih 2 buah koin 1 (Total = 25+5+1+1= 32)

Solusi : Jumlah koin minimum = 4 (solusi optimal!)

o Solusi permasalahan Integer Knapsack


a. Greedy by profit. - Pada setiap langkah, pilih objek yang mempunyai
keuntungan terbesar. - Mencoba memaksimumkan keuntungan dengan
memilih objek yang paling menguntungkan terlebih dahulu.
b. Greedy by weight. - Pada setiap langkah, pilih objek yang mempunyai
berat teringan. - Mencoba memaksimumkan keuntungan dengan
dengan memasukkan sebanyak mungkin objek ke dalam knapsack.
c. Greedy by density. - Pada setiap langkah, knapsack diisi dengan objek
yang mempunyai pi /wi terbesar. - Mencoba memaksimumkan
keuntungan dengan memilih objek yang mempunyai keuntungan per
unit berat terbesar.

Greedy by profit & density memberi solusi optimal

Ketiga solusi gagal memberi solusi


o Pemilihan objek berdasarkan salah satu dari ketiga strategi di atas tidak
menjamin akan memberikan solusi optimal.

Solusi permasalahan Fractional Knapsack

a) Hitung harga pi/wi , i = 1, 2, ..., n


b) Urutkan seluruh objek berdasarkan nilai pi/wi dari besar ke kecil
c) Panggil Fractinonal Knapsack

o Strategi pemilihan objek berdasarkan densitas pi /wi terbesar akan selalu


memberikan solusi optimal.

o Agar proses pemilihan objek berikutnya optimal, maka kita urutkan objek
berdasarkan pi /wi yang menurun, sehingga objek berikutnya yang dipilih
adalah objek sesuai dalam urutan itu.

o Jika p1/w1 >= p2/w2 >= ... >= pn/wn maka algoritma greedy dengan
strategi pemilihan objek berdasarkan pi /wi terbesar menghasilkan solusi
yang optimum.

Sebagai contoh dari penyelesaian masalah dengan algoritma greedy, mari


kita lihat sebuah masalah klasik yang sering dijumpai dalam kehidupan
sehari-hari: mencari jarak terpendek dari peta. Misalkan kita ingin bergerak
dari titik A ke titik B, dan kita telah menemukan beberapa jalur dari peta:
Jalur dari Titik A ke B

• Dari peta yang ditampilkan di samping, dapat dilihat bahwa terdapat


beberapa jalur dari titik A ke titik B. Sistem peta pada gambar secara
otomatis telah memilih jalur terpendek (berwarna biru). Kita akan
mencoba mencari jalur terpendek juga, dengan menggunakan algoritma
greedy.

• Langkah pertama yang harus kita lakukan tentunya adalah memilih


struktur data yang tepat untuk digunakan dalam merepresentasikan peta.
Jika dilihat kembali, sebuah peta seperti pada gambar di atas pada
dasarnya hanya menunjukkan titik-titik yang saling berhubungan, dengan
jarak tertentu pada masing-masing titik tersebut. Misalnya, peta di atas
dapat direpresentasikan dengan titik-titik penghubung seperti berikut:

Graph Sederhana dari Titik A ke B

Dari gambar di atas, kita dapat melihat bagaimana sebuah peta jalur
perjalanan dapat direpresentasikan dengan menggunakan graph, spesifiknya
Directed Graph (graph berarah). Maka dari itu, untuk menyelesaikan
permasalahan jarak terpendek ini kita akan menggunakan struktur data graph
untuk merepresentasikan peta. Berikut adalah graph yang akan digunakan:
Graph Berarah dari Titik A ke B

Untuk mencari jarak terpendek dari A ke B, sebuah algoritma greedy akan


menjalankan langkah-langkah seperti berikut:

1) Kunjungi satu titik pada graph, dan ambil seluruh titik yang dapat
dikunjungi dari titik sekarang.
2) Cari local maximum ke titik selanjutnya.
3) Tandai graph sekarang sebagai graph yang telah dikunjungi, dan pindah ke
local maximum yang telah ditentukan.
4) Kembali ke langkah 1 sampai titik tujuan didapatkan.

Jika mengapliikasikan langkah – langkah di atas pada graph A ke B


sebelumnya maka kita akan mendapatkan pergerakan seperti berikut:

1) Mulai dari titik awal (A). Ambil seluruh titik yang dapat dikunjungi.
2) Langkah Pertama Greedy
3) Local maximum adalah ke C, karena jarak ke C adalah yang paling
dekat.
4) Tandai A sebagai titik yang telah dikunjungi, dan pindah ke C.

Ambil seluruh titik yang dapat dikunjungi dari C.


Langkah pertama greedy

5) Local maximum adaah ke D, dengan jarak 6.


6) Tandai C sebagai titik yang telah dikunjungi, dan pindah ke D.
Langkah Ketiga Greedy
7) (Langkah selanjutnya diserahkan kepada pembaca sebagai latihan).
8)

Langkah ketig greedy

Dengan menggunakan algoritma greedy pada graph di atas, hasil


akhir yang akan didapatkan sebagai jarak terpendek adalah A-C-D-E-F-B.
Hasi jarak terpendek yang didapatkan ini tidak tepat dengan jarak
terpendek yang sebenarnya (A-G-E-F-B). Algoritma greedy memang tidak
selamanya memberikan solusi yang optimal, dikarenakan pencarian local
maximum pada setiap langkahnya, tanpa memperhatikan solusi secara
keseluruhan. Gambar berikut memperlihatkan bagaimana algoritma greedy
dapat memberikan solusi yang kurang optimal:

Solusi Kurang Optimal dari Greedy


Tetapi ingat bahwa untuk kasus umum, kerap kali algoritma greedy
memberikan hasil yang cukup baik dengan kompleksitas waktu yang
cepat. Hal ini mengakibatkan algoritma greedy sering digunakan untuk
menyelesaikan permasalahan kompleks yang memerlukan kecepatan
jawaban, bukan solusi optimal, misalnya pada game.
ALGORITMA
DEVIDE AND CONQUER

Algoritma Divide and Conquer merupakan algoritma yang sangat populer


di dunia Ilmu Komputer. Divide and Conquer merupakan algoritma yang
berprinsip memecah-mecah permasalahan yang terlalu besar menjadi
beberapa bagian kecil sehingga lebih mudah untuk diselesaikan. Langkah-
langkah umum algoritma Divide and Conquer :
 Divide : Membagi masalah menjadi beberapa upa-masalah yang memiliki
kemiripan dengan masalah semula namun berukuran lebih kecil ( idealnya
berukuran hampir sama ).
 Conquer : Memecahkan ( menyelesaikan ) masing-masing upa-masalah
( secara rekursif ).
 Combine : Menggabungkan solusi masing-masing upa-masalah sehingga
membentuk solusi masalah semula.

Objek masalah yang di bagi adalah masukan (input) atau instances yang
berukuran n: tabel (larik), matriks, dan sebagainya, bergantung pada
masalahnya. Tiap-tiap upa-masalah mempunyai karakteristik yang sama (the
same type) dengan karakteristik masalah asal, sehingga metode Divide and
Conquer lebih natural diungkapkan dalam skema rekursif.

Nah di bawah ini merupakan contoh coding programnya:

#include <stdio.h>
#include <conio.h>

int a[100];
int max, min;
void maxmin(int i, int j) {
int max1, min1, mid;
if(i==j) {
max=min=a[i]; }
else if(i==j-1) {
if(a[i]>a[j]) {
max=a[i];
min=a[j]; }
else {
max=a[j];
min=a[i]; }
}

else {
mid=(i+j)/2;
maxmin(i, mid);
max1=max;
min1=min;
maxmin(mid+1, j);
if(max<max1)
max=max1;
if(min>min1)
min=min1; }
}

void main() {
int i, num;
clrscr();
printf("\n\t\t\t Maximum & Minimum \n\n");
printf("\nMasukkan banyak angka: ");
scanf("%d",&num);
printf("\nMasukkan angkanya: \n");
for(i=0;i<num;i++) {
scanf("%d",&a[i]); }
max=a[0];
min=a[0];
maxmin(0,num-1);
printf("\nMaximum angka: %d\n", max);
printf("Minimum angka: %d\n", min);
getch();
}

Output dari program di atas adalah sebagai berikut:


Disini saya memasukkan sebanyak 7 data, dengan rincian: 12, 34, 56, 78,
90, 23, dan 89. Dan dapat kita lihat hasil dari programnya, program
mendapatkan nilai maximum: 90 dan nilai minimum: 12
Logika dari coding program di atas adalah sebagai berikut:

#include <conio.h>
peryataan conio.h. adalah library pada C yang digunakan untuk mengkoneksikan
pernyataan clrscr() dengan program yang kita buat. Tanpa menggunakan library
ini, kita tidak bisa menggunakan fungsi prototype seperti: gotoxy(), clrscr(),
clreol().

#include <stdio.h>
Dalam c++ jika kita menginginkan penggunaan input dan output, atau bisa
diartikan sebagai standard library yang berfungsi untuk I/O package maksudnya
digunakan jika kita ingin pada program kita menggunakan fungsi standard input
atau output bisa dikatakan seperti portable input/output package. Tanpa
menggunakan library ini, kita tidak bisa menggunakan perintah-perintah
input/output pada program kita.

int a[100];
int max, min;
Pernyataan diatas digunakan untuk mendeklarasikan variable. Untuk int a[100]
artinya variable a bertipe data integer (bilangan bulat) array dan memiliki
tampungan hingga 100 karakter. Sedangkan untuk int max, min artinya variable
max dan min bertipe data integer (bilangan bulat).

void maxmin(int i, int j) {


Pernyataan diatas adalah procedure untuk melakukan penghitungan dengan
identitas maxmin dengan variable utamanya integer i dan integer j.

if(i==j) {... }
Pernyataan diatas adalah kondisi utama (prioritas) sebuah percabangan dalam
suatu program.

else if(i==j-1) {... }


Pernyataan diatas adalah kondisi kedua (alternative) sebuah percabangan dalam
suatu program, pernyataan ini akan dieksekusi jika kondisi dalam pernyataan
utama tidak terpenuhi.

else {... }
Sedangkan pernyataan diatas adalah kondisi terakhir sebuah percabangan dalam
suatu program, pernyataan ini akan dieksekusi jika kondisi dalam pernyataan
utama dan kedua tidak terpenuhi.
void main() {
Pernyataan diatas adalah main procedure (prosedur utama dalam program ini).
Fungsinya sama seperti public.static.void.main(String args[]) { pada bahasa
pemrograman java.

clrscr();
Pernyataan di atas digunakan untuk membersihkan layar ketika program
dieksekusi.

printf("\n\t\t\t Maximum & Minimum \n\n");


Pernyataan printf di atas digunakan untuk mencetak tulisan yang ada diantara
tanda kutip “ ”, yaitu Maximum dan Minimum. Pernyataan \n digunakan agar
tulisan utama yang dicetakada jedanya (enter) pada saat program dieksekusi,
sedangkan pernyataan \t digunakan agar tulisan utama yang dicetak menjorok
kedalam (tab) pada saat dieksekusi.

scanf("%d",&num);
Pernyataan scanf digunakan untuk menyimpan angka yang kita input ketika
program dieksekusi. Disini terdapat %d yang mengartikan data inputan akan
ditampilkan dalam bentuk decimal, dan &num mengartikan data inputan akan
disimpan sementara pada variable num.

for(i=0;i<num;i++) { scanf("%d",&a[i]); }
Pernyataan for di atas digunakan sebagai kondisi perulangan pada program,
program akan mengeksekusi dimulai dari 0 hingga terpenuhi kondisi i<num , dan
variable i akan terus bertambah 1 terpenuhi kondisi i<num. Hasil dari eksekusi
perulangan di atass akan tersimpan kedalam baris pernyataan scanf(“%d”,&a[ i ]).

getch();
berguna unutk membaca sebuah karakter, bisa juga membaca tombol, getch()
tidak akan menampilkan karakter dari tombol yang ditekan. Sebuah getch() bisa
pula digunakan untuk menunggu sembarang tombol ditekan. Pada keadaan seperti
ini, hasil dari fungsi ini tidak perlu diletakkan ke variable, atau dipascal dapat
diartikan sebagai readln.

Anda mungkin juga menyukai