Algoritme pencarian biner

Sebuah algoritme 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 te7ngah (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 algoritme divide and conquer (atau lebih khusus algoritme decrease and conquer) dan sebuah pencarian dikotomi (lebih rinci di Algoritme pencarian).

Algoritme

BuPenerapan 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 algoritme 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, algoritme 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 algoritme logaritmik dan bekerja dalam waktu O(log n). Secara khusus,  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.

Penerapan pada teori kompleksitas

Seandainya kita tidak mengetahui sebuah jangkauan yang tetap tempat dari bilangan kberada, kita masih dapat menentukan nilainya dengan mengajukan  pertanyaan ya/tidak dalam bentuk "Apakah k lebih besar dari x?" untuk beberapa bilangan x. Sebagai konsekuensi sederhana dari cara ini, jika kita dapat menjawab pertanyaan "Apakah nilai bilangan bulat k lebih besar dari nilai yang diberikan?" pada suatu waktu kemudian kita dapat menemukan nilai dari bilangan tersebut sama lamanya ditambah dengan faktor log k. Hal ini disebut sebuah reduksi, dan karena disebabkan reduksi ini maka kebanyakan teoris kompleksitas berkonsentrasi pada permasalahan keputusan, algoritme-algoritme yang mengasihlan jawaban sederhana berupa ya/tidak.
Sebagai contoh, anggap kita dapat menjawab "Apakah matriks n x n ini memiliki determinan lebih besar dari k?" dalam waktu O(n²). Kemudian, dengan memanfaatkan pencarian biner, kita dapat menemukan (batas atas) determinan tersebut dalam waktu O(n²log d), dimana d adalah determinan; sebagai catatan, d bukanlah ukuran dari masukan tetapi ukuran dari keluaran.