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.
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
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).
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.
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.
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!”.
1. Maksimasi (maximization)
2. Minimasi (minimization)
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.
Strategi greedy: Pada setiap langkah, pilihlah koin dengan nilai terbesar
dari himpunan koin yang tersisa.
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.
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
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.
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.
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.
#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();
}
#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).
if(i==j) {... }
Pernyataan diatas adalah kondisi utama (prioritas) sebuah percabangan dalam
suatu program.
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.
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.