Pecah · Taklukkan · Gabungkan
Paradigma desain algoritma yang menyelesaikan masalah besar dengan cara memecahnya secara rekursif menjadi submasalah yang lebih kecil, lalu menggabungkan solusinya.
Berasal dari strategi militer Romawi "divide ut imperes" — memecah kekuatan musuh agar mudah dikalahkan. Diterapkan dalam ilmu komputer sejak era 1945 oleh John von Neumann (Merge Sort).
Bayangkan puzzle 1000 keping — bagi menjadi kelompok kecil, selesaikan tiap kelompok secara mandiri, lalu gabungkan hasilnya menjadi gambar utuh.
Bagi masalah berukuran n menjadi a submasalah, masing-masing berukuran n/b. Proses pembagian harus menghasilkan submasalah yang serupa dengan masalah asal.
Selesaikan setiap submasalah secara rekursif. Jika submasalah cukup kecil (base case: n ≤ n₀), selesaikan langsung tanpa rekursi lebih lanjut.
Gabungkan solusi dari semua submasalah menjadi solusi final masalah utama. Tahap ini menentukan total kompleksitas tambahan f(n).
Merge Sort membagi array menjadi dua bagian sama besar secara rekursif hingga ukuran 1, lalu menggabungkan kembali dalam urutan terurut. Ditemukan oleh John von Neumann, 1945.
Quick Sort menggunakan elemen pivot untuk mempartisi array: elemen lebih kecil di kiri, lebih besar di kanan. Proses ini dilakukan rekursif hingga array terurut.
Binary Search bekerja pada array terurut. Setiap iterasi, rentang pencarian dipotong menjadi setengahnya, menghasilkan efisiensi O(log n) dibanding O(n) pada pencarian linear.
Alat analitis untuk menyelesaikan rekurens bentuk T(n) = aT(n/b) + f(n), dimana a ≥ 1 (jumlah submasalah), b > 1 (faktor pembagi), f(n) (biaya combine).
| Algoritma | Best Case | Average Case | Worst Case | Space | Stabil? |
|---|---|---|---|---|---|
| Merge Sort | O(n log n) | O(n log n) | O(n log n) | O(n) | ✓ Ya |
| Quick Sort | O(n log n) | O(n log n) | O(n²) | O(log n) | ✗ Tidak |
| Binary Search | O(1) | O(log n) | O(log n) | O(1) | N/A |
| Strassen Matrix | O(n²·⁸¹) | O(n²·⁸¹) | O(n²·⁸¹) | O(n²) | N/A |
💡 Catatan: Strassen Matrix Multiplication lebih baik dari O(n³) naive, meski lebih rumit. Binary Search membutuhkan array sudah terurut sebagai prasyarat.
⚡ Kapan pakai D&C? Ideal ketika masalah dapat dipecah menjadi submasalah independen yang serupa. Jika submasalah saling bergantung → gunakan Dynamic Programming.
Algoritma Karatsuba memperkalikan dua bilangan n-digit dalam O(n^1.585) vs O(n²) naive. Digunakan di kriptografi RSA dan komputasi big number.
QuadTree & Octree mempartisi ruang 2D/3D secara rekursif untuk collision detection dan rendering di game engine (Unity, Unreal). Juga digunakan dalam image compression.
Sistem DNS menggunakan pencarian hierarkis rekursif — dari root server ke TLD server ke authoritative server, memecah domain "www.google.com" menjadi bagian-bagian kecil.
Menemukan 2 titik terdekat dari n titik dalam O(n log n). Digunakan dalam pemetaan (GPS), robotika, dan analisis cluster data besar.
Algoritma BLAST untuk alignment sekuens DNA menggunakan D&C untuk membandingkan miliaran pasangan basa secara efisien dalam proyek Human Genome.
FFT (Cooley-Tukey) membagi sinyal secara rekursif untuk transformasi dalam O(n log n). Digunakan di pemrosesan sinyal audio, kompresi MP3, dan 5G.
| Aspek | Divide & Conquer | Dynamic Programming | Greedy |
|---|---|---|---|
| Submasalah | Independen | Overlapping (tumpang tindih) | Pilihan lokal optimal |
| Pendekatan | Top-down rekursif | Bottom-up / memoization | Iteratif, pilih terbaik |
| Memori | Stack rekursi | Tabel memo/DP (besar) | O(1) — minimal |
| Garansi optimal? | Ya | Ya | Tidak selalu |
| Contoh | Merge Sort, Quick Sort | Fibonacci, Knapsack, LCS | Dijkstra, Huffman, Kruskal |
🔑 Kunci perbedaan: D&C = submasalah tidak tumpang tindih. DP = submasalah tumpang tindih + memoization. Greedy = keputusan lokal berulang tanpa rekursi penuh.
Mencari nilai minimum dan maksimum secara bersamaan dalam satu array. D&C lebih efisien karena mengurangi jumlah perbandingan dari 2(n-1) menjadi ⌈3n/2⌉ - 2.
Divide and Conquer adalah fondasi dari algoritma-algoritma paling efisien di dunia