Greedy Algorithm — Algoritma

Greedy Algorithm selalu memilih opsi terbaik saat ini tanpa memikirkan dampak jangka panjang. Kadang ini menghasilkan solusi optimal, kadang tidak. Kapan…

Greedy Algorithm selalu memilih opsi terbaik saat ini tanpa memikirkan dampak jangka panjang. Kadang ini menghasilkan solusi optimal, kadang tidak.

Kapan greedy bekerja? Jika masalah punya greedy-choice property — pilihan lokal terbaik selalu mengarah ke solusi global terbaik.

Contoh 1: Coin Change (greedy works)

// Kembalian minimum (denominasi: 1, 5, 10, 25)
function coinChange(amount) {
  const coins = [25, 10, 5, 1];
  const result = [];

  for (const coin of coins) {
    while (amount >= coin) {
      result.push(coin);
      amount -= coin;
    }
  }

  return result;
}

coinChange(41); // [25, 10, 5, 1] → 4 koin

Peringatan: Greedy untuk coin change tidak selalu optimal. Dengan denominasi [1, 3, 4], greedy untuk 6 = [4, 1, 1] (3 koin), tapi optimal = [3, 3] (2 koin). Gunakan DP untuk kasus umum.

Contoh 2: Activity Selection

// Pilih aktivitas terbanyak yang tidak overlap
function activitySelection(activities) {
  // Sort by end time
  activities.sort((a, b) => a.end - b.end);

  const selected = [activities[0]];
  let lastEnd = activities[0].end;

  for (let i = 1; i < activities.length; i++) {
    if (activities[i].start >= lastEnd) {
      selected.push(activities[i]);
      lastEnd = activities[i].end;
    }
  }

  return selected;
}

Greedy vs Dynamic Programming:

Fitur Greedy DP
Pendekatan Pilih terbaik saat ini Coba semua opsi
Kecepatan Lebih cepat Lebih lambat
Optimal? Kadang Selalu (jika applicable)
Kapan pakai Greedy-choice property Overlapping subproblems

🎭 Analogi sehari-hari: Greedy = makan prasmanan dengan strategi "ambil yang paling enak dulu". Kadang ini optimal (kamu kenyang dengan makanan favorit). Kadang gak (lihat ada lobster di akhir, perut udah penuh). Greedy bagus untuk masalah yang lokal optimal = global optimal, tapi banyak masalah gak begitu.

💡 Cara cek apakah greedy works:

  1. Buktikan secara matematik (susah)
  2. Bandingkan dengan DP untuk test cases — kalau hasilnya sama, greedy bisa dipakai
  3. Cari counterexample — kalau ketemu greedy gagal, jangan pakai

Standar: kalau buktinya ribet, pakai DP (lebih aman).

⚠️ Jebakan umum:

🎯 Greedy biasanya works untuk:

Greedy GAGAL untuk:

🧪 Tebakan cepat: Coin change [1, 3, 4] untuk 6. Greedy: 4+1+1 = 3 koin. Optimal (DP): 3+3 = 2 koin. Greedy salah. Selalu cek dulu.

TL;DR: Greedy = pilih lokal optimal di setiap langkah. Cepat dan simpel TAPI gak selalu optimal. Wajib ada greedy-choice property. Kalau ragu, pakai DP.