Setiap algoritma punya trade-off — tidak ada yang sempurna. Skill seorang programmer adalah memilih trade-off yang tepat untuk situasi tertentu.
Time vs Space
| Pendekatan | Time | Space | Contoh |
|---|---|---|---|
| Brute force | O(n²) | O(1) | Two sum with nested loops |
| Hash map | O(n) | O(n) | Two sum with hash |
| Memoization | O(n) | O(n) | Fibonacci with cache |
| Iteratif | O(n) | O(1) | Fibonacci with 2 variables |
Panduan Memilih Algoritma
Pertanyaan yang harus dijawab:
- Seberapa besar datanya? (n)
- Apakah data sudah terurut?
- Butuh solusi optimal atau cukup "cukup baik"?
- Batasan memori?
- Real-time atau batch processing?
Rule of thumb berdasarkan n:
| n | Max O | Strategi |
|---|---|---|
| ≤ 10 | O(n!) | Brute force, backtracking |
| ≤ 20 | O(2ⁿ) | Bitmask DP |
| ≤ 500 | O(n³) | DP 3D |
| ≤ 5.000 | O(n²) | DP 2D, brute force OK |
| ≤ 100.000 | O(n log n) | Sort-based, binary search |
| ≤ 1.000.000 | O(n) | Linear scan, hash map |
| > 1.000.000 | O(log n) | Binary search, math |
Ringkasan Semua Teknik
| Teknik | Kapan Pakai |
|---|---|
| Sorting | Data perlu diurutkan untuk optimasi |
| Binary Search | Data terurut, cari elemen/boundary |
| Two Pointer | Pair/triplet di sorted array |
| Sliding Window | Subarray/substring berturut-turut |
| Hash Map | Pencarian O(1), counting |
| Recursion | Tree/graph, masalah rekursif |
| DP | Overlapping subproblems |
| Greedy | Locally optimal = globally optimal |
| Backtracking | Semua kombinasi, constraint satisfaction |
| D&C | Masalah bisa dipecah independen |
Selamat! Kamu sekarang punya fondasi yang kuat dalam algoritma dan struktur data. Terus latih dengan soal-soal praktis!
🎭 Analogi sehari-hari: Belajar masak. Awalnya hafal resep satu-satu. Lama-lama, kamu paham konsep — kapan deep fry vs sauté, kapan add salt early vs late. Algoritma sama: awalnya hafal merge sort, quick sort. Lama-lama paham pattern — divide & conquer, greedy, DP. Pattern lebih penting dari hafalan.
💡 Skill paling penting yang dilatih:
- Recognize pattern — "Ini Two Sum variant pakai Hash Map"
- Estimate complexity — "Ini O(n²), n=100rb berarti 10 milyar ops, terlalu lambat"
- Trade off — "Pake Hash Map nambah memory tapi cut O(n²) jadi O(n)"
Bukan hafal kode, tapi paham kapan pakai apa.
⚠️ Jebakan saat solve problem:
- Langsung coding tanpa think — selalu rancang algoritma di kertas/komen dulu
- Lupa edge case — array kosong, 1 elemen, semua sama, sorted descending
- Skip "what is brute force?" — selalu mulai dari naive, baru optimasi
- Optimize prematurely — make it work first, fast second
- Lupa space complexity — algoritma O(n) cepat tapi makan 10GB RAM = bencana
🎯 Cara grow as algorithm thinker:
- Solve problem dengan brute force dulu — cek paham masalahnya
- Identify bottleneck — di mana O(n²) keluar?
- Apply pattern — Hash Map? Two Pointer? DP?
- Test edge case — kosong, 1, banyak duplicate, sorted, reverse
- Latihan rutin — LeetCode/HackerRank 1 problem per hari > 10 problem 1 hari per minggu
🧪 Self-check: Pelajari ini dengan benar kalau bisa jelaskan trade-off Hash Map vs Set vs Array di interview tanpa baca catatan, dan pilih sort algorithm berdasar n + sifat data.
TL;DR: Algoritma & DS = pattern recognition + trade-off thinking. Bukan hafal kode. Latihan rutin > marathon. Mulai brute force, identify bottleneck, apply pattern. Foundation untuk semua kerjaan engineering.