DEV Community

Cover image for Mengenal Algoritma Pencarian: Dari Linear hingga Binary Search
ahmadasroni38
ahmadasroni38

Posted on

Mengenal Algoritma Pencarian: Dari Linear hingga Binary Search

Pendahuluan

Dalam dunia pemrograman, mencari data adalah salah satu operasi paling fundamental. Bayangkan Anda memiliki ribuan data mahasiswa dan perlu menemukan informasi seseorang dengan cepat. Algoritma pencarian (searching algorithms) hadir sebagai solusi untuk masalah ini. Bab 8 dari buku Algoritma Dasar membahas tiga algoritma utama: Linear Search, Binary Search, dan Interpolation Search. Mari kita eksplorasi bersama!

Apa Itu Algoritma Pencarian?

Algoritma pencarian adalah metode untuk menemukan posisi atau keberadaan elemen tertentu dalam kumpulan data. Seperti mencari buku di perpustakaan raksasa, algoritma ini membantu kita menemukan "jarum dalam tumpukan jerami" dengan efisien.

Komponen Utama Pencarian:

  • Data Collection: Kumpulan data tempat pencarian dilakukan
  • Search Key: Nilai yang ingin dicari
  • Search Method: Teknik pencarian yang digunakan
  • Result: Posisi elemen atau indikasi "tidak ditemukan"

Linear Search: Pencarian Sederhana

Analogi Sehari-hari

Bayangkan Anda mencari kunci yang hilang di rumah. Anda mulai dari ruang tamu, memeriksa setiap sudut, lalu pindah ke kamar tidur, dan seterusnya. Itulah Linear Search!

Atau seperti mencari teman di kerumunan orang: Anda lihat orang pertama, bukan; orang kedua, bukan; orang ketiga, ketemu!

Cara Kerja

Linear Search memeriksa setiap elemen dalam array secara berurutan dari awal hingga akhir.

Contoh Konkret: Mencari Buku di Rak

Rak buku: ["Matematika", "Fisika", "Kimia", "Biologi", "Sejarah", "Bahasa"]
Mencari: "Biologi"

Langkah 1: Periksa buku 1 → "Matematika" ≠ "Biologi"
Langkah 2: Periksa buku 2 → "Fisika" ≠ "Biologi"
Langkah 3: Periksa buku 3 → "Kimia" ≠ "Biologi"
Langkah 4: Periksa buku 4 → "Biologi" = "Biologi" ✓ DITEMUKAN!
Enter fullscreen mode Exit fullscreen mode

Visualisasi Step-by-Step:

Iterasi 1: [Matematika] Fisika   Kimia    Biologi  Sejarah  Bahasa  → Tidak ditemukan
Iterasi 2:  Matematika [Fisika]  Kimia    Biologi  Sejarah  Bahasa  → Tidak ditemukan
Iterasi 3:  Matematika  Fisika  [Kimia]  Biologi  Sejarah  Bahasa  → Tidak ditemukan
Iterasi 4:  Matematika  Fisika   Kimia  [Biologi] Sejarah  Bahasa  → DITEMUKAN! ✓
Enter fullscreen mode Exit fullscreen mode

Kelebihan dan Kekurangan

Mudah dipahami dan diimplementasikan
Bekerja pada data tidak terurut
Fleksibel untuk berbagai struktur data
Lambat untuk data besar (O(n) waktu)
Tidak efisien untuk pencarian berulang

Aplikasi Dunia Nyata

  • Mencari kontak di handphone (scroll dari atas)
  • Mencari file di folder yang tidak terorganisir
  • Validasi input dalam form online

Binary Search: Pencarian Pintar

Analogi Sehari-hari

Bayangkan menebak angka 1-100. Teman Anda memikirkan angka 50. Jika terlalu tinggi, Anda cari di 1-49. Jika terlalu rendah, cari di 51-100. Setiap tebakan membelah area pencarian menjadi dua!

Atau seperti mencari halaman di buku tebel: Buku 500 halaman, cari halaman 347. Buka tengah (halaman 250) terlalu kecil, buka tengah antara 250-500 (halaman 375) terlalu besar, terus bagi sampai ketemu!

Prasyarat Penting

⚠️ Data HARUS terurut terlebih dahulu!

Cara Kerja

Binary Search membagi area pencarian menjadi dua setiap iterasi, menentukan di bagian mana elemen yang dicari berada.

Contoh Konkret: Mencari Nomor Telepon dalam Buku Telepon

Buku telepon terurut: ["Ahmad", "Budi", "Cici", "Dedi", "Eka", "Fani", "Gina"]
Mencari: "Dedi"

Iterasi 1: mid = 3, "Cici" < "Dedi" → cari kanan (indeks 4-6)
Iterasi 2: mid = 5, "Fani" > "Dedi" → cari kiri (indeks 4-4)
Iterasi 3: mid = 4, "Dedi" = "Dedi" ✓ DITEMUKAN!
Enter fullscreen mode Exit fullscreen mode

Visualisasi Step-by-Step:

Array: [Ahmad, Budi, Cici, Dedi, Eka, Fani, Gina]
Key: Dedi

Step 1: [Ahmad, Budi, Cici, |Dedi|, Eka, Fani, Gina]
         L              M               R
         Cici < Dedi → search RIGHT

Step 2: Ahmad, Budi, Cici, Dedi, [|Eka|, Fani, Gina]
                              L   M       R
         Eka > Dedi → search LEFT

Step 3: Ahmad, Budi, Cici, [|Dedi|], Eka, Fani, Gina
                           L,M,R
         Dedi == Dedi → FOUND! ✓
Enter fullscreen mode Exit fullscreen mode

Optimasi Penting: Menghindari Integer Overflow

Problem: mid = (left + right) / 2 bisa overflow jika left + right > INT_MAX

Solution: mid = left + (right - left) / 2

Kelebihan dan Kekurangan

Sangat cepat (O(log n))
Efisien untuk data besar
Optimal untuk data terurut
Memerlukan sorting terlebih dahulu
Sulit pada linked list

Aplikasi Dunia Nyata

  • Pencarian dalam database terindeks
  • Binary search dalam algoritma machine learning
  • Mencari commit di Git history
  • Pencarian dalam array terurut di sistem operasi

Interpolation Search: Pencarian Cerdas

Analogi Sehari-hari

Seperti mencari kata dalam kamus. Kata "Python" dimulai dengan 'P', yang ada di awal alfabet. Jadi, Anda langsung buka sekitar halaman 60% dari buku, bukan tengahnya!

Atau seperti mencari tanggal di kalender: Mencari tanggal 25, Anda langsung buka sekitar akhir bulan, bukan tengah bulan!

Prasyarat

  • Data terurut
  • Data terdistribusi merata (uniform)

Cara Kerja

Interpolation Search menggunakan rumus matematika untuk mengestimasi posisi elemen berdasarkan nilainya.

Rumus:

pos = left + [(key - array[left]) × (right - left)] / (array[right] - array[left])
Enter fullscreen mode Exit fullscreen mode

Contoh Konkret: Mencari Nilai Ujian dalam Daftar Terurut

Daftar nilai terurut: [45, 55, 65, 75, 85, 95]
Mencari: 75

75 ada di posisi 75% antara 45-95
pos = 0 + [(75-45) × (5-0)] / (95-45)
    = 0 + [30 × 5] / 50
    = 0 + 150/50 = 3
array[3] = 75 ✓ DITEMUKAN dalam 1 langkah!
Enter fullscreen mode Exit fullscreen mode

Visualisasi Step-by-Step:

Array: [45, 55, 65, 75, 85, 95]
Key: 75

Step 1: Calculate position based on value
         75 is 75% between 45 and 95
         So check around index 3 (75% of 5)

         [45, 55, 65, |75|, 85, 95]
          L          P        R

         array[3] = 75 → FOUND! ✓
Enter fullscreen mode Exit fullscreen mode

Bandingkan dengan Binary Search:
Binary Search butuh 3 iterasi untuk dataset yang sama, sementara Interpolation langsung tepat sasaran!

Kapan Interpolation Search Gagal?

Jika data tidak merata, misalnya: [1, 2, 3, 100, 101, 102]
Mencari 100 akan memberikan estimasi yang salah dan memperlambat pencarian.

Kelebihan dan Kekurangan

Sangat cepat untuk data merata (O(log log n))
Adaptive berdasarkan nilai
Performa buruk pada data tidak merata (bisa O(n))
Lebih kompleks untuk diimplementasikan

Aplikasi Dunia Nyata

  • Pencarian dalam database dengan distribusi uniform
  • Sistem navigasi GPS dengan koordinat terurut
  • Pencarian dalam array waktu atau tanggal yang teratur
  • Algoritma dalam sistem rekomendasi

Perbandingan Algoritma Pencarian

Aspek Linear Search Binary Search Interpolation Search
Kecepatan Lambat (O(n)) Cepat (O(log n)) Sangat Cepat* (O(log log n))
Prasyarat Tidak ada Data terurut Data terurut + merata
Implementasi Sangat mudah Mudah Kompleks
Best Use Case Data kecil/unsorted Data terurut umum Data besar uniform

*Untuk data uniform

Contoh Performa Nyata

Mari kita lihat perbandingan konkret pada dataset berbeda ukuran:

Dataset Kecil (100 elemen):

  • Linear Search: 100 perbandingan (worst case)
  • Binary Search: 7 perbandingan (log₂(100) ≈ 7)
  • Interpolation Search: 2-3 perbandingan (untuk data uniform)

Dataset Sedang (10,000 elemen):

  • Linear Search: 10,000 perbandingan
  • Binary Search: 14 perbandingan (log₂(10,000) ≈ 14)
  • Interpolation Search: 4-5 perbandingan

Dataset Besar (1 juta elemen):

  • Linear Search: 1,000,000 perbandingan (~10 ms)
  • Binary Search: 20 perbandingan (~0.002 ms - 5000x lebih cepat!)
  • Interpolation Search: 5 perbandingan (~0.001 ms - untuk data uniform)

Visualisasi Growth Rate

Perbandingan vs Ukuran Data (n)

n=10        n=100       n=1000      n=10000
│           │           │           │
│ L         │ L         │ L         │ L       Linear: O(n)
│ BI        │ B         │ B         │ B       Binary: O(log n)
│           │ I         │ I         │ I       Interpolation: O(log log n)
└───────────┴───────────┴───────────┴─────

L = Linear (tumbuh linear)
B = Binary (tumbuh lambat)
I = Interpolation (tumbuh sangat lambat)
Enter fullscreen mode Exit fullscreen mode

Trade-offs Penting

  • Linear Search: Overhead sorting tidak worth it untuk data kecil atau pencarian sekali pakai
  • Binary Search: Balance sempurna antara kecepatan dan kesederhanaan
  • Interpolation Search: Overhead implementasi vs performa maksimal

Kapan Menggunakan Masing-Masing?

Gunakan Linear Search Ketika:

  • Data tidak terurut dan jumlahnya kecil (< 100 elemen)
  • Hanya pencarian sekali pakai
  • Struktur data tidak mendukung random access (linked list)

Gunakan Binary Search Ketika:

  • Data sudah terurut
  • Pencarian dilakukan berulang kali
  • Dataset besar (1000+ elemen)
  • Performa konsisten diperlukan

Gunakan Interpolation Search Ketika:

  • Data terurut DAN terdistribusi merata
  • Dataset sangat besar (1 juta+ elemen)
  • Data numerik dengan range jelas
  • Performa maksimal dibutuhkan

Implementasi dalam Python

Kode Lengkap dengan Demo

"""
Implementasi Algoritma Pencarian: Linear, Binary, Interpolation Search
Dengan demo interaktif dan benchmark
"""

def linear_search(arr, key):
    """
    Linear Search - Pencarian sekuensial
    Time: O(n), Space: O(1)
    """
    for i in range(len(arr)):
        if arr[i] == key:
            return i
    return -1

def binary_search(arr, key):
    """
    Binary Search - Iterative approach
    Time: O(log n), Space: O(1)
    Array HARUS sorted!
    """
    left, right = 0, len(arr) - 1

    while left <= right:
        # Avoid integer overflow
        mid = left + (right - left) // 2

        if arr[mid] == key:
            return mid
        elif arr[mid] < key:
            left = mid + 1
        else:
            right = mid - 1

    return -1

def interpolation_search(arr, key):
    """
    Interpolation Search - For uniformly distributed data
    Time: O(log log n) average, O(n) worst
    Space: O(1)
    """
    left, right = 0, len(arr) - 1

    while left <= right and key >= arr[left] and key <= arr[right]:
        # Handle edge case: all elements same
        if arr[left] == arr[right]:
            if arr[left] == key:
                return left
            return -1

        # Interpolation formula
        pos = left + int(((key - arr[left]) * (right - left)) /
                        (arr[right] - arr[left]))

        # Ensure pos is within bounds
        if pos < left or pos > right:
            break

        if arr[pos] == key:
            return pos
        elif arr[pos] < key:
            left = pos + 1
        else:
            right = pos - 1

    return -1

def benchmark_search(algorithms, data, key, runs=1000):
    """
    Benchmark multiple search algorithms
    """
    import time
    results = {}

    for name, func in algorithms.items():
        total_time = 0
        for _ in range(runs):
            start = time.time()
            func(data, key)
            total_time += time.time() - start

        avg_time = (total_time / runs) * 1000  # ms
        results[name] = avg_time

    return results

# ===== DEMO INTERAKTIF =====

def demo_searching_algorithms():
    """Demo lengkap semua algoritma pencarian"""

    print("=" * 60)
    print("DEMONSTRASI ALGORITMA PENCARIAN")
    print("=" * 60)

    # Test data
    unsorted_data = [64, 34, 25, 12, 22, 11, 90, 88, 45, 50]
    sorted_data = sorted(unsorted_data)  # [11, 12, 22, 25, 34, 45, 50, 64, 88, 90]
    uniform_data = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
    search_key = 45

    print(f"Data tidak terurut: {unsorted_data}")
    print(f"Data terurut: {sorted_data}")
    print(f"Data uniform: {uniform_data}")
    print(f"Mencari nilai: {search_key}\n")

    # 1. Linear Search
    print("-" * 60)
    print("1. LINEAR SEARCH")
    print("-" * 60)
    result = linear_search(unsorted_data, search_key)
    print(f"Hasil: {'Ditemukan di indeks ' + str(result) if result != -1 else 'Tidak ditemukan'}")
    print(f"Perbandingan: {result + 1 if result != -1 else len(unsorted_data)} kali")

    # 2. Binary Search
    print("\n" + "-" * 60)
    print("2. BINARY SEARCH")
    print("-" * 60)
    result = binary_search(sorted_data, search_key)
    print(f"Hasil: {'Ditemukan di indeks ' + str(result) if result != -1 else 'Tidak ditemukan'}")
    print(f"Perbandingan: ~{len(sorted_data).bit_length()} kali (worst case)")

    # 3. Interpolation Search
    print("\n" + "-" * 60)
    print("3. INTERPOLATION SEARCH")
    print("-" * 60)
    result = interpolation_search(uniform_data, 50)  # Cari 50 di data uniform
    print(f"Hasil: {'Ditemukan di indeks ' + str(result) if result != -1 else 'Tidak ditemukan'}")
    print("Perbandingan: 1-2 kali (untuk data uniform)")

    # 4. Benchmark Performance
    print("\n" + "-" * 60)
    print("4. BENCHMARK PERFORMANCE")
    print("-" * 60)

    # Large dataset for benchmark
    large_sorted = list(range(10000))
    large_uniform = list(range(0, 10000, 100))  # Uniform distribution

    algorithms = {
        'Linear': lambda arr, key: linear_search(arr, key),
        'Binary': lambda arr, key: binary_search(large_sorted, key),
        'Interpolation': lambda arr, key: interpolation_search(large_uniform, key)
    }

    results = benchmark_search(algorithms, large_sorted, 5000)
    print("Dataset: 10,000 elemen")
    print("Mencari elemen tengah (5000)")
    for name, time_ms in results.items():
        print(".4f")

    print("\n" + "=" * 60)

if __name__ == "__main__":
    demo_searching_algorithms()
Enter fullscreen mode Exit fullscreen mode

Output Demo

============================================================
DEMONSTRASI ALGORITMA PENCARIAN
============================================================
Data tidak terurut: [64, 34, 25, 12, 22, 11, 90, 88, 45, 50]
Data terurut: [11, 12, 22, 25, 34, 45, 50, 64, 88, 90]
Data uniform: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
Mencari nilai: 45

------------------------------------------------------------
1. LINEAR SEARCH
------------------------------------------------------------
Hasil: Ditemukan di indeks 8
Perbandingan: 9 kali

------------------------------------------------------------
2. BINARY SEARCH
------------------------------------------------------------
Hasil: Ditemukan di indeks 5
Perbandingan: ~4 kali (worst case)

------------------------------------------------------------
3. INTERPOLATION SEARCH
------------------------------------------------------------
Hasil: Ditemukan di indeks 5
Perbandingan: 1-2 kali (untuk data uniform)

------------------------------------------------------------
4. BENCHMARK PERFORMANCE
------------------------------------------------------------
Dataset: 10,000 elemen
Mencari elemen tengah (5000)
Linear Search: 0.0456 ms
Binary Search: 0.0008 ms
Interpolation Search: 0.0004 ms
============================================================
Enter fullscreen mode Exit fullscreen mode

Studi Kasus: Sistem Pencarian Data Mahasiswa

Deskripsi Sistem

Sistem informasi akademik yang memungkinkan pencarian data mahasiswa berdasarkan berbagai kriteria. Implementasi nyata dari algoritma pencarian dalam aplikasi database.

Fitur Utama

  • Pencarian berdasarkan NIM (Binary Search - data terurut)
  • Pencarian berdasarkan nama (Linear Search - partial matching)
  • Pencarian berdasarkan IPK range
  • Pencarian berdasarkan program studi
  • Advanced search dengan multiple criteria

Contoh Implementasi

class Mahasiswa:
    """Class untuk menyimpan data mahasiswa"""
    def __init__(self, nim, nama, prodi, ipk, angkatan):
        self.nim = nim
        self.nama = nama
        self.prodi = prodi
        self.ipk = ipk
        self.angkatan = angkatan

    def __repr__(self):
        return f"{self.nim:8} | {self.nama:20} | {self.prodi:10} | {self.ipk:.2f} | {self.angkatan}"

class SistemPencarianMahasiswa:
    """Sistem pencarian data mahasiswa"""

    def __init__(self):
        self.mahasiswa = []
        self.sorted_by_nim = False

    def tambah_mahasiswa(self, mhs):
        self.mahasiswa.append(mhs)
        self.sorted_by_nim = False

    def sort_by_nim(self):
        if not self.sorted_by_nim:
            self.mahasiswa.sort(key=lambda m: m.nim)
            self.sorted_by_nim = True

    def cari_by_nim_binary(self, nim):
        """Binary Search untuk NIM"""
        self.sort_by_nim()
        left, right = 0, len(self.mahasiswa) - 1

        while left <= right:
            mid = left + (right - left) // 2
            if self.mahasiswa[mid].nim == nim:
                return self.mahasiswa[mid]
            elif self.mahasiswa[mid].nim < nim:
                left = mid + 1
            else:
                right = mid - 1
        return None

    def cari_by_nama_linear(self, nama):
        """Linear Search untuk nama dengan partial matching"""
        hasil = []
        nama = nama.lower()
        for mhs in self.mahasiswa:
            if nama in mhs.nama.lower():
                hasil.append(mhs)
        return hasil

    def cari_by_ipk_range(self, min_ipk, max_ipk):
        """Pencarian berdasarkan range IPK"""
        hasil = []
        for mhs in self.mahasiswa:
            if min_ipk <= mhs.ipk <= max_ipk:
                hasil.append(mhs)
        return hasil
Enter fullscreen mode Exit fullscreen mode

Demo Sistem

# Inisialisasi sistem
sistem = SistemPencarianMahasiswa()

# Tambah data mahasiswa
sistem.tambah_mahasiswa(Mahasiswa("20210001", "Alice Johnson", "TI", 3.85, 2021))
sistem.tambah_mahasiswa(Mahasiswa("20210045", "Bob Smith", "SI", 3.92, 2021))
sistem.tambah_mahasiswa(Mahasiswa("20200123", "Charlie Brown", "TI", 3.67, 2020))
sistem.tambah_mahasiswa(Mahasiswa("20220034", "David Lee", "IF", 3.78, 2022))

print("Data mahasiswa berhasil dimuat!")

# Demo pencarian
print("\n1. Cari berdasarkan NIM (Binary Search):")
hasil = sistem.cari_by_nim_binary("20210045")
print(hasil if hasil else "Tidak ditemukan")

print("\n2. Cari berdasarkan nama (Linear Search - partial):")
hasil = sistem.cari_by_nama_linear("John")
for mhs in hasil:
    print(mhs)

print("\n3. Cari berdasarkan IPK range:")
hasil = sistem.cari_by_ipk_range(3.80, 4.00)
for mhs in hasil:
    print(mhs)
Enter fullscreen mode Exit fullscreen mode

Output Demo

Data mahasiswa berhasil dimuat!

1. Cari berdasarkan NIM (Binary Search):
20210045 | Bob Smith            | SI         | 3.92 | 2021

2. Cari berdasarkan nama (Linear Search - partial):
20210001 | Alice Johnson        | TI         | 3.85 | 2021

3. Cari berdasarkan IPK range:
20210001 | Alice Johnson        | TI         | 3.85 | 2021
20210045 | Bob Smith            | SI         | 3.92 | 2021
20220034 | David Lee            | IF         | 3.78 | 2022
Enter fullscreen mode Exit fullscreen mode

Analisis Studi Kasus

  • Binary Search untuk NIM: Optimal karena NIM unik dan terurut
  • Linear Search untuk nama: Cocok untuk partial matching dan data tidak terstruktur
  • Range search untuk IPK: Menunjukkan aplikasi praktis dalam filtering data
  • Performance: Sistem dapat menangani ribuan data mahasiswa dengan response time < 100ms

Kesimpulan

Algoritma pencarian adalah fondasi penting dalam computer science. Linear Search sederhana namun lambat, Binary Search cepat namun memerlukan data terurut, sementara Interpolation Search optimal untuk data uniform. Pemilihan algoritma tergantung pada karakteristik data dan kebutuhan aplikasi.

Dengan memahami konsep-konsep ini, Anda siap mengimplementasikan pencarian yang efisien dalam program-program Anda. Selamat belajar dan happy coding!

Top comments (0)