edubun
Bahasa Indonesia

Pencarian: pencarian linear dan biner

Untuk menemukan satu nama dalam daftar terurut berisi sejuta nama, pencarian biner tidak pernah butuh lebih dari 20 kali pemeriksaan.

Mencari satu nilai

Pencarian adalah masalah menemukan letak sebuah nilai dalam sekumpulan data, atau mengetahui bahwa nilai itu tidak ada. Ponselmu melakukannya saat kamu mengetik nama kontak, toko melakukannya saat memeriksa apakah suatu barang masih ada stoknya, dan pemeriksa ejaan melakukannya untuk setiap kata yang kamu ketik. Masukannya adalah sebuah daftar dan nilai target. Keluarannya adalah posisi target, atau tanda seperti -1 yang berarti "tidak ditemukan".

Pencarian linear: satu per satu

Metode paling sederhana adalah mulai dari kiri dan memeriksa setiap nilai bergiliran sampai target ditemukan atau daftarnya habis. Inilah pencarian linear. Cara ini bisa dipakai pada daftar apa pun, terurut atau tidak. Biayanya bergantung pada keberuntungan: kalau target ada di posisi pertama, satu pemeriksaan sudah cukup; kalau target ada di posisi terakhir atau tidak ada, kamu memeriksa setiap nilai. Untuk daftar berisi n nilai, kasus terburuknya n kali pemeriksaan. Daftar yang dua kali lebih panjang bisa butuh pemeriksaan dua kali lebih banyak, dan dari situlah nama "linear" berasal: pekerjaannya bertambah mengikuti garis lurus seiring ukurannya.

function linearSearch(list, target) {
  for (let i = 0; i < list.length; i++) {
    if (list[i] === target) return i;  // ketemu
  }
  return -1;                             // semua sudah diperiksa
}

Pencarian biner: bagi dua sisanya

Kalau daftarnya terurut, kamu bisa jauh lebih cepat. Bayangkan permainan tebak angka: seseorang memilih bilangan dari 1 sampai 100 dan hanya menjawab "lebih tinggi" atau "lebih rendah". Pemain yang cerdik menebak 50 lebih dulu. Apa pun jawabannya, separuh kemungkinan langsung hilang. Tebakan berikutnya adalah tengah-tengah dari yang tersisa, dan seterusnya. Pencarian biner melakukan persis hal ini pada daftar terurut. Pencarian ini memakai dua penanda, lo dan hi, yang mengapit bagian tempat target masih mungkin berada. Pencarian memeriksa nilai tengahnya. Kalau itu targetnya, selesai. Kalau nilai tengah lebih kecil daripada target, semua nilai di sebelah kirinya juga lebih kecil, jadi lo berpindah melewati tengah. Kalau lebih besar, hi berpindah ke sebelum tengah. Saat lo melewati hi, tidak ada yang tersisa dan target tidak ada dalam daftar.

function binarySearch(list, target) {
  let lo = 0, hi = list.length - 1;
  while (lo <= hi) {
    const mid = Math.floor((lo + hi) / 2);
    if (list[mid] === target) return mid;
    if (list[mid] < target) lo = mid + 1;  // target ada di kanan
    else hi = mid - 1;                     // target ada di kiri
  }
  return -1;
}
Memuat

Seret untuk memutar. Gulir atau cubit untuk memperbesar.

Daftar terurut berisi 31 bilangan. Pilih target, lalu jalankan pencarian biner dan pencarian linear langkah demi langkah dan bandingkan jumlah pemeriksaannya.

Berapa kali pemeriksaan?

Setiap pemeriksaan dalam pencarian biner paling sedikit membagi dua bagian yang tersisa. Mulai dari n nilai, setelah satu pemeriksaan tersisa paling banyak sekitar n/2, setelah dua sekitar n/4, dan seterusnya sampai tinggal satu nilai. Banyaknya pembagian dua yang diperlukan untuk turun dari n ke 1 adalah logaritma basis 2 dari n, ditulis log₂ n. Kalau pemeriksaan terakhir ikut dihitung, pencarian biner butuh paling banyak ⌊log₂ n⌋ + 1 pemeriksaan, dengan ⌊ ⌋ berarti dibulatkan ke bawah. Untuk 100 nilai, hasilnya 7 pemeriksaan, karena itulah permainan tebak angka selalu bisa dimenangkan dalam 7 tebakan. Untuk 1000 nilai hasilnya 10, untuk sejuta 20, dan untuk satu miliar 30.

Ukuran daftar nPencarian linear, kasus terburukPencarian biner, kasus terburuk
773
1001007
1,0001,00010
1,000,0001,000,00020
1,000,000,0001,000,000,00030

Syaratnya: daftar harus terurut

Pencarian biner hanya berhasil karena dalam daftar terurut, satu perbandingan memberi tahu di sisi mana target pasti berada. Pada daftar yang tidak terurut, nilai tengah tidak memberi tahu apa pun tentang tetangganya, jadi kamu kembali ke pencarian linear. Mengurutkan juga butuh kerja (dua bab berikutnya membahasnya), jadi pilihannya bergantung pada pemakaian. Kalau kamu mencari dalam sebuah daftar sekali saja, pencarian linear mungkin paling murah. Kalau kamu mencari dalam daftar yang sama ribuan kali, mengurutkannya sekali lalu memakai pencarian biner cepat terbayar. Tawar-menawar antara menyiapkan data dan menjawab pertanyaan tentang data itu muncul di seluruh bidang ini.

Kesalahan klasik dalam pencarian biner ada di langkah pembaruan. Menulis lo = mid alih-alih lo = mid + 1 bisa membuat perulangan berjalan selamanya saat tinggal dua nilai, karena mid tidak pernah berubah. Nilai tengah sudah diperiksa, jadi nilai itu boleh dikeluarkan dari rentang berikutnya.
pencarian linearMemeriksa nilai satu per satu dari awal
pencarian binerMemeriksa tengah rentang yang terurut dan membuang separuh yang tidak mungkin berisi target
kasus terburukMasukan yang membuat algoritma bekerja paling banyak
log₂ nBerapa kali n bisa dibagi dua sebelum mencapai 1
lo dan hiKedua ujung rentang tempat target masih mungkin berada
-1Nilai kembalian yang umum, artinya "tidak ditemukan"
  1. Paling banyak berapa pemeriksaan yang dibutuhkan pencarian biner untuk daftar terurut berisi 1000 nilai?
  2. Paling banyak berapa pemeriksaan yang dibutuhkan pencarian linear untuk daftar berisi 1000 nilai?
  3. Pencarian biner membutuhkan daftar yang
    • terurut
    • pendek
    • terdiri atas bilangan bulat
    • tanpa nilai berulang
  4. Dalam daftar [2, 5, 8, 12, 16, 23, 38, 56, 72, 91], berapa pemeriksaan yang dilakukan pencarian biner untuk menemukan 23?
  5. Dalam daftar yang sama, berapa pemeriksaan yang dilakukan pencarian linear untuk menemukan 23?
  6. Pencarian biner memeriksa nilai tengah 40 saat mencari 25. Apa yang terjadi berikutnya?
    • hi pindah ke tepat sebelum tengah
    • lo pindah ke tepat sesudah tengah
    • pencarian berhenti: 25 tidak ada
    • pencarian memeriksa nilai berikutnya di sebelah kanan
  7. Kamu boleh menebak bilangan dari 1 sampai 100 dan diberi tahu "lebih tinggi" atau "lebih rendah". Dengan strategi terbaik, berapa tebakan yang selalu cukup?
  8. Ukuran sebuah daftar menjadi dua kali lipat. Apa yang terjadi pada jumlah pemeriksaan pencarian biner dalam kasus terburuk?
    • Bertambah dua kali lipat
    • Bertambah sekitar satu
    • Tetap sama persis
    • Dikuadratkan
  9. Kamu akan mencari satu nilai dalam daftar yang tidak terurut, hanya sekali. Mana yang lebih murah?
    • Pencarian linear
    • Urutkan daftarnya, lalu lakukan pencarian biner
  10. Mengapa lo = mid (alih-alih mid + 1) bisa membuat pencarian biner berputar tanpa henti?
    • Saat tersisa dua nilai, mid bisa tetap sama di setiap putaran
    • mid menjadi negatif
    • JavaScript tidak mengizinkannya
    • Daftarnya bertambah panjang
  11. Paling banyak berapa kali pemeriksaan yang dibutuhkan pencarian biner untuk 1 000 000 nilai?
Poin penting
  • Pencarian linear memeriksa satu nilai setiap kali: paling banyak n pemeriksaan.
  • Pencarian biner membagi dua rentang yang tersisa: paling banyak ⌊log₂ n⌋ + 1 pemeriksaan.
  • Pencarian biner hanya bisa dipakai pada daftar yang terurut.
  • Sejuta nilai: paling banyak 20 pemeriksaan.
  • Perbarui dengan mid + 1 dan mid − 1 supaya rentangnya selalu menyempit.
Sumber kursus ini (11)
  • MIT OpenCourseWare 6.006 Introduction to Algorithms, Spring 2020 (Demaine, Ku, Solomon)
  • lecture notes 1 Introduction, 3 Sorting, 9 Breadth-First Search, 10 Depth-First Search (ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/pages/lecture-notes) and Fall 2011 lecture 13 BFS notes (ocw.mit.edu/courses/6-006-introduction-to-algorithms-fall-2011)
  • Cormen, Leiserson, Rivest, Stein, Introduction to Algorithms (MIT Press)
  • with the CLRS-based Khan Academy algorithms unit by Thomas Cormen and Devin Balkcom of Dartmouth (khanacademy.org/computing/computer-science/algorithms: binary search, selection sort analysis, merge sort, quicksort overview and analysis)
  • MacTutor History of Mathematics, Al-Khwarizmi (mathshistory.st-andrews.ac.uk/Biographies/Al-Khwarizmi: word algorithm from the Latin title Algoritmi de numero Indorum)
  • D. E. Joyce, Euclid's Elements Book VII Propositions 1 and 2 (mathcs.clarku.edu/~djoyce/elements/bookVII)
  • Wolfram MathWorld, Merge Sort (mathworld.wolfram.com/MergeSort.html: proposed by John von Neumann in 1945, after Knuth 1998 p. 159)
  • Stanford CS "Tony Hoare: Quicksort" (cs.stanford.edu/people/eroberts/courses/soco/projects/2008-09/tony-hoare/quicksort.html: devised while a student at Moscow State University for Russian-English machine translation with a tape dictionary, programmed in Algol 60 and published 1961; the year 1959 from the Wikipedia Quicksort article and its cited sources)
  • Bodleian Libraries, Ada Lovelace (blogs.bodleian.ox.ac.uk/adalovelace: 1843 paper, Note G Bernoulli numbers)
  • Fourmilab text of Menabrea's Sketch with Lovelace's notes (fourmilab.ch/babbage/sketch.html)
  • Seven Bridges of Konigsberg (Euler 1736) and Tower of Hanoi (Edouard Lucas, 1883) checked against the Wikipedia articles and their cited sources.

Diperiksa: 2026-10-17