Kamis, 27 Mei 2010

Algoritma Divide dan Conquer

Devinisi :

 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), dan

 Combine: mengabungkan solusi masing-masing upa-masalah sehingga membentuk solusi masalah semula.

Skema Umum Algoritma Divide and Conquer


Algoritma Divide dan Conquer
















k
















Penyelesaian dengan Divide and Conquer



.















Penerapan Algoritma

Pada penyelasaian masalah pencarian Convex Hull dengan menggunakan algoritma Divide and Conquer, hal ini dapat dipandang sebagai generalisasi dari algoritma pengurutan merge sort. Berikut ini merupakan garis besar gambaran dari algoritmanya:

- Pertama-tama lakukan pengurutan terhadap titik-titik dari himpunan S yang diberika berdasarkan koordinat absis-X, dengan kompleksitas waktu O(n log n).

- Jika |S| ≤ 3, maka lakukan pencarian convex hull secara brute-force dengan kompleksitas waktu O(1). (Basis).

- Jika tidak, partisi himpunan titik-titik pada S menjadi 2 buah himpunan A dan B, dimana A terdiri dari setengah jumlah dari |S| dan titik dengan koordinat absix-X yang terendah dan B terdiri dari setengah dari jumlah |S| dan titik dengan koordinat absis-X terbesar.

- Secara rekursif lakukan penghitungan terhadap HA = conv(A) dan HB = conv(B).

- Lakukan penggabungan (merge) terhadap kedua hull tersebut menjadi convex hull, H, dengan menghitung da mencari upper dan lower tangents untuk HA dan HB dengan mengabaikan semua titik yang berada diantara dua buah tangen ini.

Senin, 24 Mei 2010

ALGORITMA PENCARIAN BINER (BINARY SEARCH)

ALGORITMA PENCARIAN BINER (BINARY SEARCH)

Pencarian Biner (Binary Search) pada array yang sudah terurut

Pencarian Biner (Binary Search) dilakukan untuk :

memperkecil jumlah operasi pembandingan yang harus dilakukan antara data yang dicari dengan data yang ada di dalam tabel, khususnya untuk jumlah data yang sangat besar ukurannya.

Prinsip dasarnya adalah melakukan proses pembagian ruang pencarian secara berulang-ulang sampai data ditemukan atau sampai ruang pencarian tidak dapat dibagi lagi (berarti ada kemungkinan data tidak ditemukan).

Syarat utama untuk pencarian biner adalah data di dalam tabel harus sudah terurut, misalkan terurut menaik.

Kamus

Const N : integer = 8 { misalkan jumlah elemen array maksimum = 8 }

Type A = array [ 1 ..... N ] of integer

Cari, BatasAtas, BatasBawah, Tengah : Integer

Ketemu : boolean

ALGORITMA

Input (cari) { meminta nilai data yang akan dicari}

BatasAtas ¬ 1 { indeks array dimulai dari 1 }

BatasBawah ¬ N

Ketemu ¬ False

While (BatasAtas <>and (not ketemu) do

Tengah ¬ (BatasAtas + BatasBawah) div 2

If A [Tengah] = cari then

Ketemu ¬ true

Else

If ( A [Tengah] <>then { cari di bagian kanan }

BatasAtas ¬ Tengah + 1

Else

BatasBawah ¬ Tengah – 1 { cari di bagian kiri }

Endif

Endif

EndWhile

If (ketemu) then

Output ( ‘Data berada di index nomor’, Tengah )

Else Output ( ‘Data tidak ditemukan’ )

Endif

Contoh Nilai-Nilai data yang sudah terurut :

A

2

5

8

12

15

25

37

57

1

2

3

3

5

6

7

8

Kasus 1 : cari = 12

Loop pertama : Tengah = (BatasAtas + BatasBawah) div 2 = (1 + 8) div 2 = 4

A [Tengah] = A [4] = 12, berarti loop pertama data langsung ditemukan

Kasus 2 : cari = 15

Loop pertama : Tengah = (BatasAtas + BatasBawah) div 2 = (1 + 8) div 2 = 4

A [Tengah] = A [4] = 12 < cari =" 15," batasatas =" Tengah" 1 =" 4" 1 =" 5

Loop kedua : Tengah = (BatasAtas + BatasBawah) div 2 = (5 + 8) div 2 = 6

A [Tengah] = A [6] = 25 > cari = 15, berarti BatasBawah = Tengah - 1 = 6 - 1 = 5

Loop ketiga : Tengah = (BatasAtas + BatasBawah) div 2 = (5 + 5) div 2 = 5

A [Tengah] = A [5] = 15, berarti setelah loop ketiga, data ditemukan

Kasus 3 : cari = 10

Loop pertama : Tengah = (BatasAtas + BatasBawah) div 2 = (1 + 8) div 2 = 4

A [Tengah] = A [4] = 12 > cari = 10, berarti BatasBawah = Tengah - 1 = 4 - 1 = 3

Loop kedua : Tengah = (BatasAtas + BatasBawah) div 2 = (1 + 3) div 2 = 2

A [Tengah] = A [2] = 5 < cari =" 10," batasatas =" Tengah" 1 =" 2" 1 =" 3

Loop ketiga : Tengah = (BatasAtas + BatasBawah) div 2 = (3 + 3) div 2 = 3

A [Tengah] = A [3] = 8, berarti setelah loop ketiga, data tidak ditemukan

Untuk jumlah data sebanyak n, maka proses pembandingan maksimal sebanyak ( log n ) kali. Untuk contoh di atas, jumlah data 8, maka proses pembandingan maksimal sebanyak 3 kali.

Sumber : mita.staff.gunadarma.ac.id/Downloads/files/.../BINARY-SEARCH.doc