Anda di halaman 1dari 33

Algoritma Divide and Conquer

Divide and Conquer dulunya adalah strategi militer yang


dikenal dengan nama divide ut imperes.

Sekarang strategi tersebut menjadi strategi fundamental di


dalam ilmu komputer dengan nama Divide and Conquer
(DnC).
3

Definisi
Divide: membagi persoalan menjadi beberapa
sub-masalah yang memiliki kemiripan dengan
persoalan semula namun berukuran lebih kecil
(idealnya berukuran hampir sama),
Conquer (solve): memecahkan (menyelesaikan)
masing-masing sub-masalah.
Combine: mengabungkan solusi masing-masing
sub-masalah sehingga membentuk solusi
persoalan semula.
6

Obyek persoalan yang dibagi : masukan (input) atau


instances persoalan yang berukuran n seperti:
- array,
- matriks,
- eksponen,
- dll, bergantung persoalannya.
Tiap-tiap sub-masalah mempunyai karakteristik yang
sama (the same type) dengan karakteristik masalah
asal

Skema Umum Algoritma Divide and Conquer


procedure DIVIDE_and_CONQUER(input n : integer)
{ Menyelesaikan masalah dengan algoritma D-and-C.
Masukan: masukan yang berukuran n
Keluaran: solusi dari masalah semula
}
Deklarasi
r, k : integer
Algoritma
if n n0 then {ukuran masalah sudah cukup kecil }
SOLVE sub-masalah yang berukuran n ini
else
Bagi menjadi r sub-masalah, masing-masing berukuran n/k
for masing-masing dari r sub-masalah do
DIVIDE_and_CONQUER(n/k)
endfor
COMBINE solusi dari r sub-masalah menjadi solusi masalah semula }
endif

Jika pembagian selalu menghasilkan dua sub-masalah yang


berukuran sama:
procedure DIVIDE_and_CONQUER(input n : integer)
{ Menyelesaikan masalah dengan algoritma D-and-C.
Masukan: masukan yang berukuran n
Keluaran: solusi dari masalah semula
}
Deklarasi
r, k : integer
Algoritma
if n n0 then {ukuran masalah sudah cukup kecil }
SOLVE sub-masalah yang berukuran n ini
else
Bagi menjadi 2 sub-masalah, masing-masing berukuran n/2
DIVIDE_and_CONQUER(sub-masalah pertama yang berukuran n/2)
DIVIDE_and_CONQUER(sub-masalah kedua yang berukuran n/2)
COMBINE solusi dari 2 sub-masalah
endif

g (n)
, n n0

T (n)
2T ( n / 2) f ( n ) , n n0

10

Decrease and conquer: metode desain algoritma


dengan mereduksi persoalan menjadi beberapa subpersoalan yang lebih kecil, tetapi selanjutnya hanya
memproses satu sub-persoalan saja.
Berbeda dengan divide and conquer yang memproses
semua sub-persoalan dan menggabung semua solusi
setiap sub-persoalan.

11

Decrease and conquer terdiri dari dua tahapan:


1. Decrease: mereduksi persoalan menjadi beberapa
persoalan yang lebih kecil (biasanya dua subpersoalan).
2. Conquer: memproses satu sub-persoalan secara
rekursif.
Tidak ada tahap combine dalam decrease and
conquer.

12

Mencari Nilai Minimum dan


Maksimum (MinMaks)
Persoalan: Misalkan diberikan tabel A yang
berukuran n elemen dan sudah berisi nilai
integer.
Carilah nilai minimum dan nilai maksimum
sekaligus di dalam tabel tersebut.

13

Penyelesaian dengan Algoritma Brute Force


procedure MinMaks1(input A : TabelInt, n : integer,
output min, maks : integer)
{ Mencari nilai minimum dan maksimum di dalam tabel A yang berukuran n
elemen, secara brute force.
Masukan: tabel A yang sudah terdefinisi elemen-elemennya
Keluaran: nilai maksimum dan nilai minimum tabel
}
Deklarasi
i : integer
Algoritma:
min A1 { inisialisasi nilai minimum}
maksA1 { inisialisasi nilai maksimum }
for i2 to n do
if Ai < min then
minAi
endif
if Ai > maks then
maksAi
endif
endfor

T(n) = (n 1) + (n 1) = 2n 2 = O(n)

14

Ide penyelesaian dengan Divide and Conquer


Contoh 4.1. Misalkan tabel A berisi elemen-elemen sebagai berikut:
4

12

23

21

35

24

Ide dasar algoritma secara Divide and Conquer:


4

12

23

21

35

24

35

24

24

24

DIVIDE
4

12

23

21

SOLVE: tentukan min &


maks pada tiap bagian
4
12
23
min = 4
maks = 23

21
1
35
min = 1
maks = 35

COMBINE
4
12
23
min = 1
maks = 35

21

35

15

Ukuran tabel hasil pembagian dapat dibuat


cukup kecil sehingga mencari minimum dan
maksimum dapat diselesaikan (SOLVE) secara
trivial.
Dalam hal ini, ukuran kecil yang dipilih
adalah 1 elemen atau 2 elemen.

16

MinMaks(A, n, min, maks)


Algoritma:
1.
Untuk kasus n = 1 atau n = 2,
SOLVE: Jika n = 1, maka min = maks = A[n]
Jika n = 2, maka bandingkan kedua elemen untuk
menentukan min dan maks.
2.

Untuk kasus n > 2,


(a) DIVIDE: Bagi dua tabel A menjadi dua bagian yang sama,
A1 dan A2
(b) CONQUER:
MinMaks(A1, n/2, min1, maks1)
MInMaks(A2, n/2, min2, maks2)
(c) COMBINE:
if min1 <min2 then min <- min1 else min <- min2
if maks1 <maks2 then maks <- maks2 else maks <- maks1
17

Contoh 4.2. Tinjau kembali Contoh di atas.


DIVIDE dan CONQUER:
4

12

23

21

35

24

12

23

21

35

24

12

23

21

35

24

SOLVE dan COMBINE:


4

35

min = 4
maks = 12

12

min = 9
maks = 23

min = 1
maks = 21

min = 35
maks =35

min = 2
maks = 24

23

21

35

24

12

23

min = 4
maks = 23

12

23

min = 4
maks = 23

12

min = 1
maks = 35

21

min = 1
maks = 21

min = 2
maks = 35

21

35

24

24

24

min = 1
maks = 35

23

21

18

procedure MinMaks2(input A : TabelInt, i, j : integer,


output min, maks : integer)
Deklarasi
min1, min2, maks1, maks2 : integer
Algoritma:
if i=j then
{ 1 elemen
}
minAi
maksAi
else
if (i = j-1) then
{ 2 elemen
}
if Ai < Aj then
maksAj
minAi
else
maksAi
minAj
endif
else
{ lebih dari 2 elemen }
k(i+j) div 2
{ bagidua tabel pada
posisi k }
MinMaks2(A, i, k, min1, maks1)
MinMaks2(A, k+1, j, min2, maks2)
if min1 < min2 then
minmin1
else
minmin2
endif
if maks1<maks2 then
maksmaks2
else
maksmaks1
endif

19

Tugas 1
Transalasi kode pseuducode pada selide
sebelumnya ke kode C++

20

Algoritma Pencarian Secara Decrease and


Conquer
Algoritma pencarian menggunakan algoritma DnC pada data
terurut yang kinerja lebih baik adalah pencarian biner (binary
search)
Dalam kehidupan sehari-hari, kita sudah menggunakan
algoritma ini
Misal untuk mencari kata tertentu dalam kamus, kita tidak
membuka kamus dari halaman awal s.d akhir satu persatu
Supaya lebih cepat kita mencarinya dengan membagi dua buku
itu
Jika kata yang dicari tidak terdapat di halaman tengah, kita
mencari ke belahan bagian kiri atau kanan dengan cara membagi
dua belahan yang dimaksud dst, sampai kata yang dicari
ditemukan
Algoritma ini memanfaatkan teknik DnC dengan memecah
lingkup pencarian data menjadi setengahnya pada setiap kali
dibagi.
21

Binary search
Dalam proses pencarian, kita perlukan perlu
dua indeks array, yaitu indeks terkecil dan
terbesar
Contoh data yang terurut dalam array
13

14

15

16

21

76

Indeks terkecil sebagai indeks ujung kiri


dan terbesar sebagai indeks ujung kanan
22

Binary search
Algoritma binary search adalah sbb:
Langkah 1:
Bagi dua elemen array pada elemen tengah
Elemen tengah adalah elemen dengan indeks k = (i+j) div 2
Elemen tengah membagi array menjadi dua bagian, yaitu
bagian kiri L[i..k] dan bagian kanan L[k+1..j]

Langkah 2:
Periksa apakah nilai tengh L[k] = x data yang dicari?
Jika L[k] = x, pencarian selesai
Tetapi jika L[k] x, harus ditentukan apakah pencarian
dilakukan pada array sebelah kiri atau kanan
Jika L[k] < x maka pencarian dilakukan lagi pada bagian kanan
Sebaliknya, jika L[k] > x pencarian dilakukan di bagian kiri
23

Ilustrasi Binary Search ()


13

14

15

16

21

76

i=1

6=j

1. Misalkan elemen yang dicari adalah x = 15


Langkah 1:
i = 1 dan j = 6
Indeks elemen tengah k = (1+6) DIV 2 = 3 (elemen yang
berwarna)
13

14

15

16

21

76

Langkah 2:
Perbandingan L[3] = 15? Ya! (x ditemukan, pencarian selesai)
24

Ilustrasi Binary Search (O) - 1


13

14

15

16

21

76

i=1

6=j

2. Misalkan elemen yang dicari adalah x = 14


Langkah 1:
i = 1 dan j = 6
Indeks elemen tengah k = (1+6) DIV 2 = 3 (elemen yang berwarna)
13

14

15

16

21

76

Langkah 2:
Perbandingan L[3] = 14? Tidak! Harus diputuskan apakah pencarian
akan dilakukan di bagian kiri atau kanan dengan pemeriksaan sbb:

25

Ilustrasi Binary Search (O) - 2

Perbandingan: L[3] > 14? Ya! Lakukan pencarian pada array bagian
kiri dengan i = 1 (tetap) dan j = k 1 = 2
13

14

Langkah 3:
i = 1 dan j = 2
Indeks elemen tengah k = (1+2) DIV 2 = 1 (elemen yang berwarna)
13

14

Langkah 4:
Perbandingan L[1] = 14? Tidak! Harus diputuskan apakah pencarian
akan dilakukan di bagian kiri atau kanan dengan pemeriksaan sbb:
26

Ilustrasi Binary Search (O) - 3

Perbandingan: L[1] > 14? Tidak! Lakukan pencarian pada array bagian kanan
dengan i = k+1 = 2 dan j = 2 (tetap)
14
2

Langkah 5:
i = 2 dan j = 2
Indeks elemen tengah k = (2+2) DIV 2 = 2 (elemen yang berwarna)
14

Langkah 6:
Perbandingan L[2] = 14? Ya! (x ditemukan, pencarian selesai)

Kompleksitas Algoritma ini adalah log n


27

Binary search
function binarySearch (input a: array, input x:
integer, input left, input right)integer
DEKLARASI
mid: integer
ALGORITMA
if(right < left)
return 0
mid =(left + right)div 2
if (a[mid] = x)
return mid
if (x < a[mid])
return binarySearch(a,x,left,mid);
else
return binarySearch(a,x,mid+1,right);
28

Binary Search vs Sequential Search


Binary Search
Hanya dapat digunakan
pada data yang sudah terurut
Kompleksitas waktu O(log
n)
Jika jumlah data semakin
besar, maka waktu
pencarian lebih sedikit dari
sequential search
Cocok digunakan pada
pencarian dengan jumlah
data yang besar

Sequential Search
Dapat digunakan pada data
belum dan sudah terurut
Kompleksitas waktu O(n)
Kinerja pencarian untuk
kasus terburuk, memerlukan
waktu yang sebanding
dengan banyak data
Lebih sesuai digunakan
untuk pencarian pada
jumlah data yang kecil
29

Tugas 2
Transalasi kode pseuducode binary search
ke kode C++

30

Binary search
function binarySearch (input L:array, input n:integer, input
x:integer)integer
{mengembalikan indeks array L[1..n] yang mengandung nilai x,jika x tidak
ditemukan nilai indeks 0}
DEKLARASI
i,j,k : integer
ketemu : boolean
ALGORITMA:
i1
{ujung kiri array}
jn
{ujung kanan aray}
ketemu false
{asumsikan x belum ditemukan}
while(not ketemu) and (i j) do
k i+j)div 2
{bagi dua array L pada posisi k}
if (L[k]= x) then
ketemu true
else
{L[k] x}
if (L[k]> x) then
j k-1
{pencarian pada array bagian kiri}
else
i k+1
{pencarian pada array bagian kanan}
endif
endif
endwhile {ketemu = true or i > j}
if ketemu then
return k
else
return 0
endif
31

Tugas 2
Berdasarkan algoritma DnC binary search iteratif pada slide
sebelumnya, disainlah program komputer permainan tebaktebakan dimana komputer harus menebak sebuah bilangan bulat
positif yang dipilih oleh pemain lain di antara 1 dan N, dengan
memanfaatkan jawaban pertanyaan berupa Y untuk ya dan T
untuk tidak.
Misalnya N adalah 16 dan angka yang dipilih adalah 11,
permainan dapat berjalan sebagai berikut.
Apakah angka lebih besar dari 8? (Y)
Apakah angka lebih besar dari 12? (T)
Apakah angka lebih besar dari 10? (Y)
Apakah angkat lebih besar dari 11? (T)
Sehingga, angka tersebut pasti 11.
32

Tugas 3

Lakukanlah perbandingan algoritma brute force sequential search


dengan algoritma DnC binary search untuk pencarian untuk data yang
besar, kita contohkan 100.000 data
Algoritma program adalah sbb:
1.

2.

Bangkitkan bilangan random, dengan kode C sbb:


long n = 100000;
long data[n],i;
for(i=0;i<n;i++)
data[i]=rand()%100000;
Lakukan pengurutan secara ascending dengan
a. bubble sort
b. selection sort

3.

Lakukan pencarian untuk data yang bernilai 32766 dengan metode


a. Binary search
b. Sequential search

4.
5.

Apakah kompleksitas waktu dari dua metode diatas


Bandingkan waktu komputasi program dari dua metode diatas
33

Anda mungkin juga menyukai