b belajar.myudak

Searching — sequential & binary search

Dua cara mencari elemen di array, kenapa binary search jauh lebih cepat, dan jebakan klasik saat menulisnya.

dasar #searching#array#kompleksitas

Searching adalah mencari posisi sebuah nilai (biasa disebut key) di dalam kumpulan data. Ada dua algoritma dasar yang wajib dikuasai: sequential search dan binary search.

Cara paling jujur: cek elemen satu per satu dari depan sampai ketemu atau habis.

function SeqSearch(input A: array[0..n-1] of integer, input x: integer) → integer
{ mengembalikan indeks x di A, atau -1 jika tidak ada }
Deklarasi
  i : integer
Algoritma
  i ← 0
  while (i < n) and (A[i] ≠ x) do
    i ← i + 1
  endwhile
  if i < n then → i else → -1
  • Tidak butuh data terurut.
  • Kasus terbaik 1 perbandingan, terburuk nn perbandingan, jadi kompleksitasnya O(n)O(n).

Kalau data sudah terurut, kita bisa jauh lebih pintar: lihat elemen tengah, lalu buang setengah bagian yang pasti tidak berisi x. Persis seperti mencari kata di kamus.

Binary search (iteratif)

Setiap langkah membuang separuh data: n→n/2→n/4→⋯→1n \to n/2 \to n/4 \to \dots \to 1. Banyaknya langkah adalah berapa kali nn bisa dibagi 2, yaitu ⌈log⁡2(n+1)⌉\lceil \log_2 (n+1) \rceil. Untuk satu juta data, cukup 20 perbandingan.

nsequential (terburuk)binary (terburuk)
1.0001.00010
1.000.0001.000.00020
1.000.000.0001.000.000.00030

Versi rekursif

Binary search juga bisa ditulis rekursif, karena masalahnya mengecil menjadi “cari di setengah bagian”:

function bs(a: number[], x: number, lo = 0, hi = a.length - 1): number {
  if (lo > hi) return -1;                   // base case: rentang kosong
  const mid = (lo + hi) >> 1;
  if (a[mid] === x) return mid;
  return a[mid] < x ? bs(a, x, mid + 1, hi) : bs(a, x, lo, mid - 1);
}

Praktikkan di soal Binary Search dan Cari Posisi Sisip.

Telusuri interval pencarian

Cari 12 pada array terurut [2, 4, 7, 9, 12, 15]. Indeks dimulai dari nol dan batas kanan ikut diperiksa.

Binary search pada enam indeks
012345
Nilai24791215
Statuslo·mid··hi
1/3Periksa tengah. Indeks tengah 2 bernilai 7. Target lebih besar, jadi buang indeks 0 sampai 2.lo = 0 · hi = 5 · mid = 2
Cek pemahaman
  1. 1. Array terurut berisi 1.000 elemen. Maksimal berapa perbandingan yang dibutuhkan binary search?

  2. 2. Mengapa binary search tidak bisa dipakai pada linked list secara efisien?

  3. 3. Pada data [2, 4, 4, 4, 9], binary search mencari 4 mengembalikan…