Pemrograman
Dinamis: Karakteristik, Metode, dan Contohnya
Pemrograman dinamis adalah teknik solvabilitas yang
dapat menyederhanakan proses yang mengandung banyak submasalah. Profesional
dalam analisis data, pemrograman dan pengembangan perangkat lunak sering
menerapkan proses ini untuk merampingkan pekerjaan mereka karena pemrograman
dinamis dapat membantu mengoptimalkan proses pengkodean untuk banyak aplikasi
komputer. Jika Anda memasuki peran yang membutuhkan keterampilan pemrograman
dan pengkodean, akan bermanfaat untuk memahami bagaimana Anda dapat
mengintegrasikan pemrograman dinamis ke dalam proyek Anda.
Pada artikel ini, kami mendefinisikan pemrograman
dinamis dan karakteristiknya, mengeksplorasi metode untuk digunakan saat
menghitung masalah pengkodean rekursif dengan pemrograman dinamis dan
menawarkan contoh.
Apa itu
pemrograman dinamis?
Pemrograman dinamis adalah proses untuk memecahkan
masalah optimasi. Dalam proyek pengembangan perangkat lunak, pemrograman
dinamis menggunakan algoritma yang memecah masalah pengkodean kompleks menjadi
submasalah. Programmer kemudian dapat menerapkan solusi yang dioptimalkan untuk
seluruh masalah, tergantung pada jenis solusi yang mereka peroleh dari setiap
submasalah dalam kode.
Pemrograman dinamis juga mengoptimalkan rekursi biasa,
yang membantu menghilangkan kebutuhan untuk menghitung ulang data input nanti.
Karakteristik
pemrograman dinamis
Pemrograman dinamis memiliki dua karakteristik
penting, yakni :
1.
Submasalah tumpang tindih
Submasalah adalah variasi yang lebih kecil
dari masalah asli yang lebih besar. Misalnya, dalam deret Fibonacci, setiap
angka dalam deret adalah jumlah dari dua angka sebelumnya (0, 1, 1, 2, 3, 5,
8,...). Jika Anda ingin menghitung nilai Fibonacci ke-n dalam urutan, Anda dapat
memecah seluruh masalah menjadi submasalah yang lebih kecil. Submasalah ini
kemudian tumpang tindih satu sama lain saat Anda menemukan solusi dengan
menyelesaikan submasalah yang sama berulang kali.
Tumpang tindih dalam submasalah terjadi
dengan masalah apa pun, yang memungkinkan Anda menerapkan pemrograman dinamis
untuk memecah tugas pemrograman yang kompleks menjadi bagian-bagian yang lebih
kecil.
2.
Substruktur memiliki sifat optimal
Properti substruktur optimal terwujud
ketika Anda dapat mencapai solusi optimal setelah membangun semua solusi lain
yang terjadi dari setiap submasalah yang Anda pecahkan. Solusi yang Anda hitung
Dari setiap tumpang tindih berlaku untuk masalah keseluruhan agar berfungsi dan
mengoptimalkan rekursi. Dalam contoh deret Fibonacci, setiap submasalah berisi
solusi yang dapat Anda terapkan pada setiap submasalah berturut-turut untuk
menemukan angka berikutnya dalam seri, membuat seluruh masalah menampilkan
properti substruktur optimal.
Metode
pemrograman dinamis
Saat menerapkan pemrograman dinamis ke
proyek Anda, Anda dapat menerapkan dua metode dibawah in:
1.
Metode top-down
Metode top-down memecahkan masalah
keseluruhan sebelum Anda memecahnya menjadi submasalah. Proses ini bekerja
untuk memecahkan masalah yang lebih besar dengan menemukan solusi untuk
submasalah secara rekursif, caching setiap hasil. Proses menghafal ini membantu
menghindari penyelesaian masalah berulang kali jika Anda menyebutnya lebih dari
sekali. Dengan metode top-down, Anda dapat mengembalikan hasil yang Anda simpan
saat Anda menyelesaikan masalah secara keseluruhan, sehingga menyimpan hasil
masalah yang telah Anda pecahkan.
2.
Metode bottom-up
Dalam metode bottom-up, atau metode
tabulasi, Anda menyelesaikan semua sub-masalah terkait terlebih dahulu daripada
menerapkan rekursi. Karena tabulasi bottom-up membutuhkan beberapa
penyelesaian, pemrograman dinamis menggunakan tabel n-dimensi, di mana n
mewakili nilai nol atau lebih besar. Saat Anda menyelesaikan setiap submasalah
dalam tabel, Anda kemudian dapat menggunakan hasilnya untuk menghitung masalah
asli.
Contoh
pemrograman dinamis
Untuk memahami bagaimana Anda dapat
menerapkan kedua metode untuk menggunakan pemrograman dinamis, gunakan contoh
berikut untuk menerapkan proses ke deret Fibonacci:
Contoh
top-down
Terapkan
deret Fibonacci, di mana setiap angka dalam seri mewakili jumlah dari dua angka
pertama sebelumnya:
{0,
1, 1, 2, 3, 5, 8,...}
Memahami
bahwa jumlah dari dua nilai pertama sebelumnya adalah angka berikutnya dalam
seri dapat membantu Anda menyelesaikan seluruh masalah ketika Anda ingin
menghitung angka Fibonacci ke-n. Karena Anda mengetahui pola untuk menghitung
nilai masa depan dalam seri, Anda dapat menerapkan rumus untuk menentukan
solusi optimal tanpa memecah masalah menjadi submasalah yang lebih kecil.
Dengan menggunakan rumus yang sesuai saat n > 1, Anda dapat menghitung
solusi optimal dengan metode top-down saat mencari nilai ke-n 13:
Fib(n) = Fib(n - 1) + Fib(n - 2) =
Fib(13) = Fib(13 - 1) + Fib(13 - 2) =
Fib(n) = Fib(12) + Fib(11) = 23
Dengan
menggunakan pendekatan top-down dan menerapkan hafalan, Anda dapat menyimpan
hasil 23 dalam database untuk dimasukkan dan dipanggil string kode untuk tugas
tambahan.string kode untuk tugas tambahan.
Contoh
bottom-up
Dalam
contoh ini, terapkan deret Fibonacci untuk memecah seluruh perhitungan saat
Anda ingin menghitung nilai ke-n dalam deret tersebut. Dengan urutan angka yang
sama {0, 1, 1, 2, 3, 5, 8,...} , Anda dapat melihat bahwa nilai berikutnya
dalam seri menghasilkan 13, karena 5 dan 8 memberikan jumlah 13.
Menggunakan
metode bottom-up untuk memecah seluruh masalah Fib(n), terapkan persamaan
urutan [Fib(n - 1) + Fib(n - 2), ketika n > 1] untuk setiap submasalah yang
ingin Anda temukan solusi optimalnya. Misalkan Anda ingin menghitung nilai ke-n
berikutnya ketika n = 23:
Fib(n) = Fib(n - 1) + Fib(n - 2) =
Fib(23) = Fib(23 - 1) + Fib(23 - 2) =
Fib(23) = Fib(22) + Fib(21) = Fib(43)
Hasil
Fib(43) kemudian berlaku untuk perhitungan nilai berikutnya dalam seri ketika n
= 43:
Fib(n) = Fib(n - 1) + Fib(n - 2) =
Fib(43) = Fib(43 - 1) + Fib(43 - 2) =
Fib(n) = Fib(42) + Fib(41) = Fib(83)
maka
Fib(83) = Fib(83 - 1) + Fib(83 - 2) =
Fib(83) = Fib(82) + Fib(81) =
Fib(163)
Anda
dapat terus menggunakan solusi optimal ini untuk setiap submasalah untuk
menghitung nilai berikutnya dalam deret Fibonacci, memberi Anda kemampuan untuk
memecah masalah awal Fib (n) = Fib (n - 1) + Fib (n - 2), ketika n > 1.
Contoh
bottom-up
Dalam
contoh ini, terapkan deret Fibonacci untuk memecah seluruh perhitungan saat
Anda ingin menghitung nilai ke-n dalam deret tersebut. Dengan urutan angka yang
sama {0, 1, 1, 2, 3, 5, 8,...} , Anda dapat melihat bahwa nilai berikutnya dalam
seri menghasilkan 13, karena 5 dan 8 memberikan jumlah 13.
Menggunakan
metode bottom-up untuk memecah seluruh masalah Fib(n), terapkan persamaan
urutan [Fib(n - 1) + Fib(n - 2), ketika n > 1] untuk setiap submasalah yang
ingin Anda temukan solusi optimalnya. Misalkan Anda ingin menghitung nilai ke-n
berikutnya ketika n = 23:
Fib(n) = Fib(n - 1) + Fib(n - 2) =
Fib(23) = Fib(23 - 1) + Fib(23 - 2) =
Fib(23) = Fib(22) + Fib(21) = Fib(43)
Hasil
Fib(43) kemudian berlaku untuk perhitungan nilai berikutnya dalam seri ketika n
= 43:
Fib(n) = Fib(n - 1) + Fib(n - 2) =
Fib(43) = Fib(43 - 1) + Fib(43 - 2) =
Fib(n) = Fib(42) + Fib(41) = Fib(83)
maka
Fib(83) = Fib(83 - 1) + Fib(83 - 2) =
Fib(83) = Fib(82) + Fib(81) =
Fib(163)
Anda
dapat terus menggunakan solusi optimal ini untuk setiap submasalah untuk
menghitung nilai berikutnya dalam deret Fibonacci, memberi Anda kemampuan untuk
memecah masalah awal Fib (n) = Fib (n - 1) + Fib (n - 2), ketika n > 1.