Menu
CoddyTech

Binary Search (Pencarian Biner)

Terakhir diperbarui

Binary search adalah algoritma untuk mencari nilai target di array yang **terurut** dengan terus membagi dua jendela pencarian. Algoritma ini membandingkan elemen tengah dengan target: jika cocok, pencarian selesai; jika tidak, separuh yang tidak mungkin berisi target dibuang dan jendela menyusut ke separuh lainnya. Setiap perbandingan membuang separuh elemen yang tersisa, itulah sebabnya algoritma ini berjalan dalam O(log n): mencari di antara sejuta nilai terurut butuh paling banyak sekitar 20 perbandingan.

Animasi di atas menampilkan pointer lo, mid, dan hi, lalu meredupkan separuh yang dibuang setelah setiap perbandingan. Satu syarat yang tidak bisa ditawar: array harus sudah terurut. Untuk data yang tidak terurut, kamu butuh linear search atau mengurutkannya dulu (lihat merge sort). Ide membagi dua yang sama juga menjadi dasar binary search tree.

Kompleksitas waktu dan ruang

KasusKompleksitasCatatan
Kasus terbaikO(1)Elemen tengah adalah target pada perbandingan pertama.
Kasus rata-rataO(log n)Setiap perbandingan membagi dua jendela yang tersisa.
Kasus terburukO(log n)Jendela menyusut hingga satu elemen sebelum cocok atau gagal.
RuangO(1)Versi iteratif hanya menyimpan indeks lo, hi, dan mid.

Langkah demi langkah

LangkahApa yang terjadi
1Atur lo ke indeks pertama dan hi ke indeks terakhir array yang terurut.
2Hitung indeks tengah: mid = (lo + hi) // 2.
3Jika a[mid] sama dengan target, kembalikan mid (ditemukan).
4Jika a[mid] **lebih kecil** daripada target, target hanya mungkin ada di separuh kanan: atur lo = mid + 1.
5Jika a[mid] **lebih besar** daripada target, cari di separuh kiri: atur hi = mid - 1.
6Ulangi dari langkah 2 selama lo <= hi; jika jendela kosong, target tidak ada di dalam array.

Contoh penerapan

Mencari 5 di [1, 2, 3, 5, 7, 8, 9]:

PutaranJendela (lo..hi)mida[mid]Aksi
1[1, 2, 3, 5, 7, 8, 9] (0..6)35a[3] = 5: target ditemukan di indeks 3.

Pencarian yang gagal, langkah demi langkah

Mencari 4 di array yang sama menunjukkan bagaimana jendela menjadi kosong:

PutaranJendela (lo..hi)mida[mid]Aksi
10..6355 > 4: cari di separuh kiri, hi = 2.
20..2122 < 4: cari di separuh kanan, lo = 2.
32..2233 < 4, jadi lo menjadi 3 dan jendela kosong: tidak ditemukan.
Pakai saatHindari saat
Datanya sudah terurut (atau kamu mencarinya berkali-kali)Datanya tidak terurut dan hanya dicari sekali (mengurutkannya dulu berbiaya O(n log n))
Koleksinya mendukung akses acak yang cepat (array)Kamu hanya punya akses berurutan (linked list)
Datanya besar (O(log n) unggul pada skala besar)Datanya sangat kecil (pemindaian sederhana sama cepatnya dan lebih sederhana)

Implementasi Binary Search yang rapi dan siap dijalankan dalam Python, JavaScript, Java, C++, C, Pseudocode. Pilih bahasa, salin kodenya, atau buka langsung di Coddy Playground.

Kode Binary Search dalam Python

Python
1def binary_search(a, target):2    lo, hi = 0, len(a) - 13    while lo <= hi:4        mid = (lo + hi) // 25        if a[mid] == target:6            return mid7        if a[mid] < target:8            lo = mid + 1  # search the right half9        else:10            hi = mid - 1  # search the left half11    return -112
13
14nums = [1, 2, 3, 5, 7, 8, 9]  # must be sorted15print("Index of 5:", binary_search(nums, 5))16print("Index of 4:", binary_search(nums, 4))
Jalankan kode ini di Playground Python
Berapa kompleksitas waktu binary search?
O(log n) pada kasus rata-rata dan terburuk, karena setiap perbandingan membagi dua jendela pencarian yang tersisa, dan O(1) pada kasus terbaik saat elemen tengah pertama adalah target. Versi iteratif memakai ruang tambahan O(1).
Mengapa binary search membutuhkan array yang terurut?
Langkah membagi dua bergantung pada urutan: membandingkan target dengan elemen tengah hanya memberi tahu separuh mana yang harus dibuang jika semua elemen di kiri tengah lebih kecil dan semua elemen di kanannya lebih besar. Pada data yang tidak terurut, kesimpulan itu tidak berlaku, jadi pakai linear search atau urutkan datanya dulu.
Apa perbedaan binary search dan linear search?
Linear search memindai elemen satu per satu (O(n)) dan bekerja pada array apa pun; binary search membagi dua jendela pencarian array yang terurut (O(log n)), tetapi membutuhkan input yang terurut. Untuk beberapa item saja, perbedaannya tidak terasa; pada skala besar, binary search menang telak.
Berapa banyak perbandingan yang dibutuhkan binary search?
Paling banyak sekitar log2(n) + 1: 10 perbandingan mencakup 1.000 elemen, 20 perbandingan mencakup 1.000.000. Pertumbuhan logaritmik itulah yang menjadikannya cara pencarian bawaan pada data terurut.
Apa bug overflow klasik pada binary search?
Menghitung titik tengah sebagai (lo + hi) / 2 bisa membuat integer berukuran tetap overflow saat lo + hi melebihi nilai maksimum tipenya. Bentuk yang aman adalah mid = lo + (hi - lo) / 2. Di Python hal ini tidak masalah (integer berpresisi bebas), tetapi di Java/C/C++ ini adalah bug yang nyata dan terkenal.
Apakah binary search sama dengan binary search tree?
Keduanya memakai ide membagi dua yang sama, tetapi strukturnya berbeda: binary search adalah algoritma pada array terurut, sedangkan binary search tree adalah struktur data bertaut yang menjaga key-nya tetap berurutan sehingga pencarian turun ke kiri atau ke kanan di setiap node.
Ilustrasi bahasa pemrograman di Coddy

Kuasai algoritma bersama Coddy

Mulai