Está en la página 1de 21

Ali Akbar

23507042

Permasalahan Algoritmik
Greedy(1):
Jembatan Reot
 Problem:
 Kakek: 7 menit, nenek: 6 menit, ibu: 2 menit, dan ayah: 1 menit
 Solusi optimum:
 Ayah dan ibu = 2 menit
 Ayah kembali = 1 menit
 Nenek dan kakek = 7 menit
 Ibu kembali = 2 menit
 Ayah dan ibu = 2 menit
 Greedy:
 Karena ayah adalah orang yang tercepat dalam menyeberang, pada tiap
kali penyeberangan, ayah-lah yang menemani penyeberangan, dan
kembali lagi.
 2+1 +6+1 +7 = 17 menit.
Greedy(1):
Routing
Greedy(3):
PlayGame (TopCoder 2004)

 Greedy: untuk setiap unit musuh, unit yang


dipilih adalah unit terkecil dimana nilai
kekuatan a < b.
Greedy(4):
BarnRepair

 Mulai dengan seluruh stall tertutup oleh satu board. Untuk


setiap berikutnya yang tersedia:
 Pilih deretan stall yang seharusnya didak tertutup, yang
paling banyak jumlahnya.
 Bagi area board yang sebelumnya menutupi deretan stall
tersebut, dan tutupi bagian sisanya dengan board yang baru
 Sampai seluruh N board terpakai untuk menutupi stall yang
harus ditutupi. Algoritma ini selalu menghasilkan solusi
optimum.
Greedy(5):
Penjadwalan Disk
 Setiap kali ada request baru, request tersebut
dimasukkan dalam queue yang terurut
berdasarkan jarak dari cylinder tempat head
saat ini berada. Algoritma greedy seperti ini
tidak menghasilkan solusi paling optimal,
tapi hanya cukup optimal jika dibandingkan
overhead perhitungan penjadwalannya
Backtrack(1):
Jembatan Reot
 Representasi pohon untuk permasalahan ini
adalah sebagai berikut:
 Setiap simpul menyatakan status saat ini, siapa
saja yang sudah diseberang, dan siapa saja yang
belum berada di seberang.
 Setiap sisi menyatakan siapa saja yang saat ini
menyeberang.
 Dengan fungsi pembatas yaitu jika waktunya
telah melebihi 20 menit
Backtrack(2):
Pendeta dan Monster

 Setiap status posisi pendeta dan monster menjadi satu


simpul, dan sisi pada pohon berarti langkah yang diambil
 Sebuah simpul dibunuh kalau:
 Menyatakan keadaan di mana di salah satu sisi sungai, jumlah
monster lebih banyak dari jumlah pendeta
 Merupakan status yang sama dengan simpul yang pernah muncul di
atasnya (simpul nenek moyangnya)
Backtrack(3):
Routing
Backtrack(4):
Problem Gundu (Cindy’s Puzzle)

 Gundu hitam hanya dapat dipindahkan ke kanan, dan gundu


putih hanya dapat dipindahkan ke kiri (tidak boleh berbalik).
 Pada setiap perpindahan, sebuah gundu dapat:
 Maju satu posisi jika ruang di depannya kosong, atau
 Melompati tepat satu buah gundu yang berbeda warna jika ruang di
depan gundu yang dilompati tersebut kosong.
Backtrack(5):
Pencarian Record Pada Basis Data dengan Index B-Tree

 Solusi:
 Baca entri dari satu blok, yang terurut berdasarkan atribut
yang dicari. Secara sequential search, cari entri paling besar
yang < ‘a’.
 Ikuti pointer yang disimpan dalam indeks.
Branch & Bound(1):
Jembatan Reot
 Fungsi f(): jumlah waktu yang telah
digunakan sampai saat ini.
 Fungsi g(): jumlah waktu tempuh jembatan
dari orang yang belum berada di seberang
Branch & Bound(2):
Pendeta dan Monster

 Fungsi f: jumlah penyeberangan yang telah


dilakukan.
 Fungsi g: jumlah pendeta dan monster yang
belum diseberang.
Branch & Bound(3):
Routing

 Dijkstra
Branch & Bound(4):
Problem Gundu (Cindy’s Puzzle)

1. Fungsi : langkah pergerakan gundu yang telah ditempuh.


2. Fungsi : jumlah gundu putih yang berada di sebelah kanan gundu hitam (untuk setiap
gundu hitam, dihitung 1 kali). Contoh:

a. )=4

b. )=3
Branch & Bound(5):
Pencarian Record Pada Basis Data dengan Index B-Tree

 Solusi:
 Representasi pohon yang digunakan sama seperti pada backtrack.
 Fungsi f: diabaikan (0 untuk semua simpul).
 Fungsi g: kedekatan nilai entri pada indeks dengan nilai ‘a’ yang
dicari.
Divide & Conquer (1):
Make Set
1 2 6 1 4 2 5 3 1

 Membuat set dari 1 2 6 1 4 2 5 3 1

array 1 2 6 1 4 2 5 3 1

1 2 6 1 4 2 5 3 1

1 2

1 2

1 2 6 1 4 2 5 3 1

1 2 6 4 2 5 3 1

1 2 6 4 5 3
Divide and Conquer (2):
String Joining
 Divide
 Membagi sampai array berukuran 1
 Conquer
 Untuk array berukuran 1, hasil joinnya adalah isi
array itu sendiri, tanpa dioperasikan.
 Combine
 Pada combine, yang dilakukan adalah
mengkonkatenasi hasil array kiri dengan separator,
dan dikonkatenasi lagi dengan hasil array kanan
Divide and Conquer (3):
Routing
 Divide
 Bagi jaringan besar menjadi jaringan yang lebih kecil
dengan memilih titik-titik koneksi antar jaringan.
 Conquer
 Selesaikan permasalahan routing pada masing-
masing subjaringan.
 Combine
 Gabungkan solusinya menjadi rute lengkap untuk
pesan yang ingin dikirimkan.
Divide and Conquer (4):
Pemangkatan

int power(int a, int b) {


if(b == 2) return a * a;
else {
int c = power (a, b/2);
if (b % 2 == 0) return c * c;
else return c * c * a;
}
}
Divide and Conquer (4):
Closest Pair

También podría gustarte