Binary search

2,458 views

Published on

Published in: Education, Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,458
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
35
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Binary search

  1. 1. Binary Search (teknik Rekursi) Catatan: Binary Search adalah salah satu algoritma pencarian yang tercepat. Kecepatan algoritma ini hanya bisa dikalahkan oleh teknik hashing, yang tidak akan dibahas di sini. Untuk mencari jutaan data, Binary Search hanya butuh O(log N) kali pembandingan (sekitar 20 kali), sedangkan Linier Search butuh O(N) pembandingan (sekitar 500.000 kali). Tapi yang harus dicatat di sini, data yang dicari harus sudah terurut! Algoritma iteratif (contohnya yang menggunakan perputaran FOR, WHILE, dsb) pada umumnya dapat dengan mudah diubah ke dalam algoritma rekursif (memanggil dirinya sendiri). Keistimewaan algoritma iteratif adalah sederhana, cepat, dan menggunakan sedikit memori. Sedangkan pada kasus seperti menelusuri pohon, algoritma rekursif jelas lebih baik karena lebih mudah difahami. Pada prinsipnya, Binary Search adalah membandingkan Key (angka yang dicari) dengan angka yang berada tepat di tengah-tengah deretan angka yang sudah terurut. Jika sama, maka itulah yang dicari. Tapi jika tidak sama, maka deretan data dipecah menjadi dua blok: Blok bawah (kecil) dan blok atas (kecil). Lalu proses diulangi terhadap blok bawah atau blok atas, tergantung besarnya Key apakah lebih kecil ataukah lebih besar daripada data yang berada di tengah- tengah tadi. #include <iostream.h> #include <conio.h> int binarySearch(int sortedArray[], int awal, int akhir, int key) { if (awal <= akhir) { int tengah = (awal + akhir) / 2; // Hitung titik tengah. if (key == sortedArray[tengah]) return tengah; // Ketemu. else if (key < sortedArray[tengah]) // Panggil prosedur binarySearch untuk setengah bagian bawah. return binarySearch(sortedArray, awal, tengah-1, key); else // Panggil prosedur binarySearch untuk setengah bagian atas. return binarySearch(sortedArray, tengah+1, akhir, key); } return -(awal + 1); // Gagal menemukan Key yang dicari. } void main(void) { int sortedArray[100]; int jumlahData, i, key;
  2. 2. int letak; cout << "Demo Binary Search menggunakan teknik rekursi" << endl; cout << "Oleh: (Ketik nama anda di sini)." << endl; cout << endl; cout << "Ada berapa banyak data? (max 100) "; cin >> jumlahData; cout << endl; cout << "Silakan Ketik " << jumlahData << " angka yg sudah terurut!" <<endl; cout << "Tiap angka dipisahkan oleh spasi." << endl; for (i = 0; i < jumlahData; i++) { cin >> sortedArray[i]; }; cout << endl; cout << "Angka berapa yang dicari? "; cin >> key; cout << endl; cout << "Mulai mencari..." << endl; letak = binarySearch(sortedArray, 0, (jumlahData - 1), key); if (letak < 0) { cout << "Maaf, data tidak ketemu." << endl; } else { cout << "Data ditemukan pada posisi ke " << (letak + 1) << endl; cout << "Pada posisi tsb terdapat angka " << sortedArray[letak] << endl; };
  3. 3. cout << endl; cout << "Tekan sembarang tombol."; getch(); } Binary Search adalah salah satu algoritma pencarian yang tercepat. Kecepatan algoritma ini hanya bisadikalahkan oleh teknik hashing, yang tidak akan dibahas di sini. Untuk mencari jutaan data, Binary Search hanyabutuh O(log N) kali pembandingan (sekitar 20 kali), sedangkan Linier Search butuh O(N) pembandingan (sekitar500.000 kali). Tapi yang harus dicatat di sini, data yang dicari harus sudah terurut! Algoritma iteratif (contohnya yang menggunakan perputaran FOR, WHILE, dsb) pada umumnya dapatdengan mudah diubah ke dalam algoritma rekursif (memanggil dirinya sendiri). Keistimewaan algoritma iteratifadalah sederhana, cepat, dan menggunakan sedikit memori. Sedangkan pada kasus seperti menelusuri pohon,algoritma rekursif jelas lebih baik karena lebih mudah difahami. Pada prinsipnya, Binary Search adalah membandingkan Key (angka yang dicari) dengan angka yangberada tepat di tengah-tengah deretan angka yang sudah terurut. Jika sama, maka itulah yang dicari. Tapi jikatidak sama, maka deretan data dipecah menjadi dua blok: Blok bawah (kecil) dan blok atas (kecil). Lalu prosesdiulangi terhadap blok bawah atau blok atas, tergantung besarnya Key apakah lebih kecil ataukah lebih besardaripada data yang berada di tengah-tengah tadi. Pencarian diawali dengan memeriksa nilai yang ada pada posisi tengah list; oleh karena nilai-nilainyaterurut, kita mengetahui apakah nilai terletak sebelum atau sesudah nilai yang di tengah tersebut, danpencarian selanjutnya dilakukan terhadap setengah bagian dengan cara yang sama. Berikut iniadalah pseudocode sederhana yang menentukan indeks (posisi) dari nilai yang diberikan dalam sebuah listberurut, aberada 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 sebuahpengulangan (loop), hasilnya adalah algoritma in-place:function binarySearch(a, value, left, right)
  4. 4. 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 foundPada kedua kasus, algoritma akan berakhir karena paa setiap pemanggilan rekursif atau pengulangan, jangkauanindeks 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 dibandingkansebuah pencarian linear. Pencarian biner dapat diimplementasikan dengan rekursi atauiterasi, seperti yangterlihat di atas, walaupun pada kebanyakan bahasa pemrograman akan lebih elegan bila dinyatakan secararekursif.

×