WELCOME GUYZZZZ...

elektro - kabe hatake

Sabtu, 29 Mei 2010

Algoritma binary search

Sebuah algoritma pencarian biner (atau pemilahan biner) adalah sebuah teknik untuk menemukan nilai tertentu dalam sebuah larik (array) linear, dengan menghilangkan setengah data pada setiap langkah, dipakai secara luas tetapi tidak secara ekslusif dalam ilmu komputer. Sebuah pencarian biner mencari nilai tengah (median), melakukan sebuah pembandingan untuk menentukan apakah nilai yang dicari ada sebelum atau sesudahnya, kemudian mencari setengah sisanya dengan cara yang sama. Sebuah pencarian biner adalah salah satu contoh dari algoritma divide and conquer (atau lebih khusus algoritma decrease and conquer) dan sebuah pencarian dikotomi (lebih rinci di Algoritma pencarian).
Penerapan terbanyak dari pencarian biner adalah untuk mencari sebuah nilai tertentu dalam sebuah list terurut. Jika dibayangkan, pencarian biner dapat dilihat sebagai sebuah permainan tebak-tebakan, kita menebak sebuah bilangan, atau nomor tempat, dari daftar (list) nilai.
Pencarian diawali dengan memeriksa nilai yang ada pada posisi tengah list; oleh karena nilai-nilainya terurut, kita mengetahui apakah nilai terletak sebelum atau sesudah nilai yang di tengah tersebut, dan pencarian selanjutnya dilakukan terhadap setengah bagian dengan cara yang sama. Berikut ini adalah pseudocode sederhana yang menentukan indeks (posisi) dari nilai yang diberikan dalam sebuah list berurut, a berada antara left dan right :
function binarySearch(a, value, left, right)
if right < left
return not found
mid := floor((right-left)/2)+left
if a[mid] = value
return mid
if value < a[mid]
return binarySearch(a, value, left, mid-1)
else
return binarySearch(a, value, mid+1, right)
Karena pemanggilan fungsi di atas adalah rekursif ekor, fungsi tersebut dapat dituliskan sebagai sebuah pengulangan (loop), hasilnya adalah algoritma in-place:
function binarySearch(a, value, left, right)
while left ≤ right
mid := floor((right-left)/2)+left
if a[mid] = value
return mid
if value < a[mid]
right := mid-1
else
left := mid+1
return not found
Pada kedua kasus, algoritma akan berakhir karena paa setiap pemanggilan rekursif atau pengulangan, jangkauan indeks right dikurang left akan selalu mengecil, dan akhirnya pasti akan menjadi negatif.
Pencarian biner adalah sebuah algoritma logaritmik dan bekerja dalam waktu O(log n). Secara khusus, 1 + log2N pengulangan yang diperlukan untuk menghasilkan jawaban. Hal ini dianggap lebih cepat dibandingkan sebuah pencarian linear. Pencarian biner dapat diimplementasikan dengan rekursi atau iterasi, seperti yang terlihat di atas, walaupun pada kebanyakan bahasa pemrograman akan lebih elegan bila dinyatakan secara rekursif.

Sebuah contoh aksi pencarian biner adalah sebuah permainan tebak-tebakan dimana seorang pemain harus menebak sebuah bilangan bulat positif yang dipilih oleh pemain lain di antara 1 dan N, dengan memanfaatkan jawaban pertanyaan berupa ya dan tidak. Misalnya N adalah 16 dan angka yang dipilih adalah 11, permainan dapat berjalan sebagai berikut.
• Apakah angka lebih besar dari 8? (Ya)
• Apakah angka lebih besar dari 12? (Tidak)
• Apakah angka lebih besar dari 10? (Ya)
• Apakah angkat lebih besar dari 11? (Tidak)
Sehingga, angka tersebut pasti 11. Pada setiap langkah, kita memilih sebuah angka yang tepat berada di tengah-tengah jangkauan nilai-nilai yang mungkin. Sebagai contoh, saat kita mengetahui angka tersebut lebih besar dari 8, tetapi lebih kecil atau sama dengan 12, kita mengetahui untuk memilih angka di tengah-tengah jangkauan [9, 12] (pada kasus ini 10 adalah yang optimal).
Paling banyak ada log2 Npertanyaan yang dibutuhkan untuk mendapatkan angka tersebut, karena setiap pertanyaan menghilangkan setengah dari ruang pencarian. Sebagai catatan bahwa dibutuhkan kurang dari satu pertanyaan (iterasi) untuk algoritma umum, karena angka tersebut dibatasi oleh sebuah jangkauan tertentu.
Walaupun angka yang kita tebak sangat banyak, pada kasus tidak ada batas atas N, kita masih dapat menemukan angka paling banyak dalam 2 [ log2 K] langkah (dimana k adalah angka yang dipilih (yang tidak diketahui)), caranya adalah dengan pertama-tama menemukan sebuah batas atas dengan melipatduakannya. Sebaai contoh, jika angka tersebut adalah 11, kita dapat menggunakan urutan tebakan sebagai berikut untuk menemukannya:
• Apakah angka lebih besar dari 1? (Ya)
• Apakah angka lebih besar dari 2? (Ya)
• Apakah angka lebih besar dari 4? (Ya)
• Apakah angka lebih besar dari 8? (Ya)
• Apakah angka lebih besar dari 16? (Tidak, N=16, lakukan seperti di atas)
(Kita mengetahui angka tersebut lebih besar dari 8)
• Apakah angka lebih besar dari 12? (Tidak)
• Apakah angka lebih besar dari 10? (Ya)
• Apakah angka lebih besar dari 11? (Tidak)
Satu penerapan sederhan, pada sistem kendali revisi, dimungkinkan memanfaatkan sebuah pencarian biner untuk melihat pada revisi mana sebuah cuplikan isi ditambahkan ke sebuah file. Dengan mudah kita lakukan sebuah pencarian biner terhadap seluruh history versi; jika isi tidak ada dalam suatu versi, suatu saat kemudian pasti akan muncul, dan jika ada pasti muncul di versi tersebut atau versi berikutnya. Cara ini lebih cepat dibandingkan dengan memeriksa setiap perbedaan antar versi.

sumber : http://id.wikipedia.org/wiki/Pencarian_biner

Algoritma Divide 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.

Sesuai dengan karakteristik pembagian dan pemecahan masalah tersebut,
maka algoritma ini dapat berjalan baik pada persoalan yang bertipe rekursif
( perulangan dengan memanggil dirinya sendiri ). Dengan demikian, algoritma ini
dapat diimplementasikan dengan cara iteratif ( perulangan biasa ), karena pada
prinsipnya iteratif hampir sama dengan rekursif.
Salah satu penggunaan algoritma ini yang paling populer adalah dalam hal
pengolahan data yang bertipe array ( elemen larik ).
Mengapa ? Karena1pengolahan array pada umumnya selalu menggunakan prinsip rekursif atau iteratif.

Penggunaan secara spesifik adalah untuk mencari nilai minimal dan
maksimal serta untuk mengurutkan elemen array. Dalam hal pengurutan ini ada
empat macam algoritma pengurutan yang berdasar pada algoritma Divide and
Conquer, yaitu merge sort, insert sort, quick sort, dan selection sort. Merge sort
dan Quick sort mempunyai kompleksitas algoritma O(n ²log n). Hal ini lebih baik
jika dibandingkan dengan pengurutan biasa dengan menggunakan algoritma brute
force.

Skema Umum Algoritma Divide and Conquer :
prosedure DIVIDE_n_CONQUER(input n : integer)
{ Masukan: masukan yang berukuran n
Keluaran: solusi dari masalah semula
}
Deklarasi
r, k : integer
Algoritma
if n ≤ n0 then { masalah sudah cukup kecil }
SOLVE sub-masalah yang berukuran n ini
else
Bagi menjadi r sub-masalah, masing-masing
Berukuran n/
for masing-masing dari r upa-masalah do
DIVIDE_n_CONQUER(n/k)
endfor
COMBINE solusi dari r sub-masalah menjadi
solusi masalah semula
endif

SUMBER : gapra.files.wordpress.com/2009/01/algoritma-divide-and-conquer.pdf