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;
}Seret untuk memutar. Gulir atau cubit untuk memperbesar.
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 n | Pencarian linear, kasus terburuk | Pencarian biner, kasus terburuk |
|---|---|---|
| 7 | 7 | 3 |
| 100 | 100 | 7 |
| 1,000 | 1,000 | 10 |
| 1,000,000 | 1,000,000 | 20 |
| 1,000,000,000 | 1,000,000,000 | 30 |
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.
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 linear | Memeriksa nilai satu per satu dari awal |
| pencarian biner | Memeriksa tengah rentang yang terurut dan membuang separuh yang tidak mungkin berisi target |
| kasus terburuk | Masukan yang membuat algoritma bekerja paling banyak |
| log₂ n | Berapa kali n bisa dibagi dua sebelum mencapai 1 |
| lo dan hi | Kedua ujung rentang tempat target masih mungkin berada |
| -1 | Nilai kembalian yang umum, artinya "tidak ditemukan" |
- Paling banyak berapa pemeriksaan yang dibutuhkan pencarian biner untuk daftar terurut berisi 1000 nilai?
- Paling banyak berapa pemeriksaan yang dibutuhkan pencarian linear untuk daftar berisi 1000 nilai?
- Pencarian biner membutuhkan daftar yang
- terurut
- pendek
- terdiri atas bilangan bulat
- tanpa nilai berulang
- Dalam daftar [2, 5, 8, 12, 16, 23, 38, 56, 72, 91], berapa pemeriksaan yang dilakukan pencarian biner untuk menemukan 23?
- Dalam daftar yang sama, berapa pemeriksaan yang dilakukan pencarian linear untuk menemukan 23?
- 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
- Kamu boleh menebak bilangan dari 1 sampai 100 dan diberi tahu "lebih tinggi" atau "lebih rendah". Dengan strategi terbaik, berapa tebakan yang selalu cukup?
- 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
- Kamu akan mencari satu nilai dalam daftar yang tidak terurut, hanya sekali. Mana yang lebih murah?
- Pencarian linear
- Urutkan daftarnya, lalu lakukan pencarian biner
- Mengapa
lo = mid(alih-alihmid + 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
- Paling banyak berapa kali pemeriksaan yang dibutuhkan pencarian biner untuk 1 000 000 nilai?
- 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