Dynamic Programming bukan sihir
- Dynamic programming adalah teknik yang digunakan untuk menyelesaikan masalah kompleks dengan memecahnya menjadi masalah-masalah kecil.
- Teknik ini bersifat alami, dan banyak algoritma umum sebenarnya merupakan penerapan dynamic programming pada masalah tertentu.
- Untuk membantu memahami dynamic programming, artikel ini memberikan pengantar yang lebih mudah dan penjelasan yang rinci.
Keluhan
- Rekayasa perangkat lunak sering kali sangat buruk dalam urusan penamaan.
- Istilah seperti 'bootstrap', 'daemon', 'cascading style sheets', 'cookie', dan 'kecerdasan buatan' terdengar ambigu atau mudah menyesatkan.
- Istilah 'dynamic programming' juga sama sekali tidak berkaitan dengan sesuatu yang 'dinamis'; sebenarnya ini adalah sebuah gagasan yang digunakan dalam perancangan algoritma.
Caching dasar
- Saat mencoba menyelesaikan masalah dengan membaginya menjadi masalah-masalah kecil yang serupa, kita bisa saja harus menyelesaikan masalah kecil yang sama berulang kali.
- Dengan contoh deret Fibonacci, jika diimplementasikan sebagai fungsi rekursif sederhana, perhitungan yang sama akan diulang berkali-kali.
- Hasilnya dapat di-cache (atau dimemoisasi) untuk menghindari perhitungan duplikat.
Caching yang dioptimalkan
- Dengan memoization, kita tetap mempertahankan rekursi, tetapi menghitung hanya hal yang diperlukan saat dibutuhkan.
- Sebagai gantinya, kita bisa menggunakan pendekatan yang menghitung semua hal yang diperlukan terlebih dahulu.
- Pendekatan ini menyelesaikan masalah tanpa pemanggilan rekursif, dan inilah yang disebut dynamic programming.
Jarak edit
- Jarak edit antara dua string adalah jumlah minimum penyuntingan yang diperlukan untuk mengubah satu string menjadi string lainnya.
- Jarak edit dapat dihitung dengan memasukkan penggantian, penyisipan, dan penghapusan karakter, dan ini bisa diselesaikan secara efisien menggunakan dynamic programming.
- Kita perlu menemukan cara untuk menurunkan solusi keseluruhan dari solusi masalah-masalah kecil.
Advent of Code, Day 12
- Dalam soal Advent of Code tanggal 12 Desember 2023, kita harus menyelesaikan nonogram 1D.
- Masalah ini bisa diselesaikan dengan brute force, tetapi memiliki kompleksitas eksponensial.
- Sebagai gantinya, dynamic programming dapat diterapkan untuk menyelesaikannya secara efisien.
Kesimpulan
- Dynamic programming memang tidak mudah, tetapi bukan sesuatu yang mustahil dijangkau oleh sebagian besar programmer.
- Jika memahami cara memecah masalah menjadi masalah-masalah kecil, kita bisa menggunakan memoization dalam berbagai situasi, dan ini merupakan peningkatan besar dibanding implementasi yang naif.
- Dengan menguasai dynamic programming, kita dapat memahami satu kelas algoritma secara utuh, lebih memahami trade-off, dan membuka kemungkinan optimasi lainnya.
Opini GN⁺
- Dynamic programming adalah teknik penting untuk menyelesaikan masalah kompleks secara efisien; alih-alih mengandalkan pendekatan rekursif murni, teknik ini dapat sangat meningkatkan performa dengan menyimpan solusi masalah kecil untuk mengurangi perhitungan berulang.
- Artikel ini sangat bermanfaat bagi software engineer pemula yang ingin memahami konsep dasar dynamic programming.
- Contoh deret Fibonacci dan jarak edit membantu memahami konsep dynamic programming, serta memberikan titik awal yang baik untuk menerapkannya pada pemecahan masalah nyata.
1 komentar
Komentar Hacker News
Artikel yang menjelaskan algoritme dynamic programming (DP) sebagai caching pada rekursi adalah hal yang bagus.
Menyukai pendekatan artikel yang pertama-tama menangani masalah secara rekursif, lalu secara bertahap menambahkan caching, kemudian menguranginya hingga sebesar ukuran cache yang benar-benar diperlukan.
Salah satu penerapan dynamic programming yang keren adalah penyelarasan berpasangan untuk urutan asam nukleat/protein.
Membagikan pengalaman tentang seorang profesor algoritme yang sangat luar biasa.
Membagikan tautan ke tulisan berjudul Dynamic Programming is not Black Magic.
Seseorang yang sebagian besar belajar pemrograman secara otodidak mengatakan bahwa jika saat mencari kerja ia diminta menggunakan dynamic programming dalam wawancara, kemungkinan ia tidak akan tahu.
Nama "dynamic programming" mungkin tidak terlihat seperti berasal dari bidang pemrograman.
Mengajukan pertanyaan apakah salah jika ketika mendengar "dynamic programming" yang terpikir hanya "memoization".
Dynamic programming bukan black magic, tetapi yang sulit adalah membuktikan bahwa sesuatu memang bisa diprogram secara dinamis dan membuktikan kebenarannya.
Untuk menguasai dynamic programming, merekomendasikan buku algoritme DPV dan kuliah Udacity dari Georgia Tech.