Memecah dan menaklukkan
Divide and Conquer berfungsi dengan membagi masalah menjadi sub-masalah, menaklukkan setiap sub-masalah secara rekursif dan menggabungkan solusi ini.
Pemrograman Dinamis
Pemrograman Dinamis adalah teknik untuk memecahkan masalah dengan subproblem yang tumpang tindih. Setiap sub-masalah diselesaikan hanya sekali dan hasil dari masing-masing sub-masalah disimpan dalam sebuah tabel (umumnya diimplementasikan sebagai array atau tabel hash) untuk referensi di masa mendatang. Sub-solusi ini dapat digunakan untuk mendapatkan solusi asli dan teknik penyimpanan solusi sub-masalah dikenal sebagai memoisasi.
Anda mungkin memikirkan DP = recursion + re-use
Contoh klasik untuk memahami perbedaannya adalah dengan melihat kedua pendekatan ini untuk mendapatkan nomor fibonacci ke-n. Periksa bahan ini dari MIT.
Pendekatan membagi dan menaklukkan
Pendekatan Pemrograman Dinamis
Perbedaan lain antara divide dan conquer dan pemrograman dinamis adalah:
Memecah dan menaklukkan:
Pemrograman dinamis:
sumber
kadang-kadang ketika pemrograman berulang, Anda memanggil fungsi dengan parameter yang sama beberapa kali yang tidak diperlukan.
Contoh terkenal angka Fibonacci:
Mari kita jalankan F (5):
Jadi kita telah memanggil: 1 kali F (4) 2 kali F (3) 3 kali F (2) 2 kali F (1)
Pendekatan Pemrograman Dinamis: jika Anda memanggil suatu fungsi dengan parameter yang sama lebih dari satu kali, simpan hasilnya ke dalam variabel untuk langsung mengaksesnya di lain waktu. Cara berulang:
Mari kita panggil F (5) lagi:
Seperti yang Anda lihat, kapan pun Anda membutuhkan panggilan ganda, Anda cukup mengakses variabel yang sesuai untuk mendapatkan nilai alih-alih menghitung ulang.
Omong-omong, pemrograman dinamis tidak berarti mengubah kode rekursif menjadi kode berulang. Anda juga dapat menyimpan subresult ke dalam variabel jika Anda menginginkan kode rekursif. Dalam hal ini teknik ini disebut memoisasi. Sebagai contoh kita terlihat seperti ini:
Jadi hubungannya dengan Divide and Conquer adalah algoritma D&D mengandalkan rekursi. Dan beberapa versi dari mereka memiliki "panggilan fungsi ganda dengan masalah parameter yang sama." Cari "perkalian rantai matriks" dan "urutan umum terpanjang" untuk contoh-contoh semacam itu di mana DP diperlukan untuk meningkatkan T (n) dari D&D juga.
sumber
Pemrograman Dinamis dan Kesamaan Divide-and-Conquer
Seperti yang saya lihat sekarang, saya dapat mengatakan bahwa pemrograman dinamis adalah perpanjangan dari paradigma divide and conquer .
Saya tidak akan memperlakukan mereka sebagai sesuatu yang sama sekali berbeda. Karena keduanya bekerja dengan secara rekursif memecah masalah menjadi dua atau lebih sub-masalah dari jenis yang sama atau terkait, sampai ini menjadi cukup sederhana untuk diselesaikan secara langsung. Solusi untuk sub-masalah kemudian digabungkan untuk memberikan solusi untuk masalah asli.
Jadi mengapa kita masih memiliki nama paradigma yang berbeda dan mengapa saya menyebut pemrograman dinamis sebagai ekstensi. Itu karena pendekatan pemrograman dinamis dapat diterapkan pada masalah hanya jika masalah memiliki batasan atau prasyarat tertentu . Dan setelah itu pemrograman dinamis memperluas pendekatan divide and conquer dengan teknik memoisasi atau tabulasi .
Ayo selangkah demi selangkah ...
Prasyarat / Pembatasan Pemrograman Dinamis
Seperti yang baru saja kita temukan ada dua atribut kunci yang harus dimiliki untuk mengatasi dan menaklukkan agar pemrograman dinamis dapat diterapkan:
Substruktur optimal - solusi optimal dapat dibangun dari solusi optimal subproblemnya
Sub-masalah yang tumpang tindih - masalah dapat dipecah menjadi subproblem yang digunakan kembali beberapa kali atau algoritma rekursif untuk masalah memecahkan subproblem yang sama berulang-ulang daripada selalu menghasilkan subproblem baru
Setelah kedua kondisi ini terpenuhi, kita dapat mengatakan bahwa masalah pembagian dan penaklukan ini dapat diselesaikan dengan menggunakan pendekatan pemrograman dinamis.
Ekstensi Pemrograman Dinamis untuk Divide dan Conquer
Pendekatan pemrograman dinamis memperluas pendekatan membagi dan menaklukkan dengan dua teknik ( memoisasi dan tabulasi ) yang keduanya memiliki tujuan untuk menyimpan dan menggunakan kembali solusi sub-masalah yang secara drastis dapat meningkatkan kinerja. Misalnya implementasi rekursif naif dari fungsi Fibonacci memiliki kompleksitas waktu di
O(2^n)
mana solusi DP melakukan hal yang sama denganO(n)
waktu saja .Memoisasi (pengisian cache top-down) mengacu pada teknik caching dan menggunakan kembali hasil yang dihitung sebelumnya. Fungsi memoized
fib
akan terlihat seperti ini:Tabulasi (pengisian cache dari bawah ke atas) serupa tetapi berfokus pada pengisian entri cache. Komputasi nilai dalam cache paling mudah dilakukan secara iteratif. Versi tabulasi
fib
akan terlihat seperti ini:Anda dapat membaca lebih lanjut tentang perbandingan memoisasi dan tabulasi di sini .
Gagasan utama yang harus Anda pahami di sini adalah bahwa karena masalah pembagian dan penaklukan kami memiliki sub-masalah yang tumpang tindih, maka caching solusi sub-masalah menjadi mungkin dan dengan demikian memoisasi / tabulasi melangkah ke tempat kejadian.
Jadi Apa Perbedaan Antara DP dan DC?
Karena kita sekarang akrab dengan prasyarat DP dan metodologinya, kami siap untuk memasukkan semua yang disebutkan di atas ke dalam satu gambar.
Jika Anda ingin melihat contoh kode, Anda dapat melihat penjelasan yang lebih terperinci di sini di mana Anda akan menemukan dua contoh algoritma: Pencarian Biner dan Edit Jarak Minimum (Jarak Levenshtein) yang menggambarkan perbedaan antara DP dan DC.
sumber
Saya berasumsi Anda sudah membaca Wikipedia dan sumber akademis lain tentang ini, jadi saya tidak akan mendaur ulang informasi itu. Saya juga harus menyatakan bahwa saya bukan ahli ilmu komputer dengan cara apa pun, tetapi saya akan membagikan dua sen saya pada pemahaman saya tentang topik-topik ini ...
Pemrograman Dinamis
Memecah masalah menjadi subproblem diskrit. Algoritma rekursif untuk urutan Fibonacci adalah contoh dari Pemrograman Dinamis, karena ia memecahkan untuk fib (n) dengan pemecahan pertama untuk fib (n-1). Untuk menyelesaikan masalah aslinya, ini memecahkan masalah yang berbeda .
Memecah dan menaklukkan
Algoritma ini biasanya memecahkan bagian masalah yang serupa, dan kemudian menyatukannya di akhir. Mergesort adalah contoh klasik dari memecah belah dan menaklukkan. Perbedaan utama antara contoh ini dan contoh Fibonacci adalah bahwa dalam penggabungan, divisi dapat (secara teoritis) berubah-ubah, dan tidak peduli bagaimana Anda mengirisnya, Anda masih menggabungkan dan menyortir. Jumlah yang sama pekerjaan yang harus dilakukan untuk menggabungkan array, tidak peduli bagaimana Anda membaginya. Memecahkan untuk fib (52) membutuhkan lebih banyak langkah daripada menyelesaikan untuk fib (2).
sumber
Saya anggap
Divide & Conquer
sebagai pendekatan rekursif danDynamic Programming
mengisi tabel.Sebagai contoh,
Merge Sort
adalahDivide & Conquer
algoritma, seperti pada setiap langkah, Anda membagi array menjadi dua bagian, panggilan rekursifMerge Sort
dan kemudian menggabungkannya.Knapsack
adalahDynamic Programming
algoritme saat Anda mengisi tabel yang mewakili solusi optimal untuk sub-masalah dari keseluruhan ransel. Setiap entri dalam tabel sesuai dengan nilai maksimum yang dapat Anda bawa dalam tas berat dengan item 1-j.sumber
Divide and Conquer melibatkan tiga langkah di setiap tingkat rekursi:
Pemrograman Dinamis melibatkan empat langkah berikut:
1. Mengkarakterisasi struktur solusi optimal.
2. Secara rekursif menentukan nilai-nilai solusi optimal.
3. Hitung nilai solusi optimal.
4. Bangun Solusi Optimal dari informasi yang dihitung .
Untuk pemahaman yang lebih mudah, mari kita lihat membagi dan menaklukkan sebagai solusi brute force dan optimalisasi sebagai pemrograman dinamis. Algoritma membagi dan menaklukkan
NB dengan subproblem yang tumpang tindih hanya dapat dioptimalkan dengan dp.
sumber
Seperti yang dapat kita lihat di atas, tidak ada fakta (x) yang diulang sehingga faktorial memiliki masalah yang tidak tumpang tindih.
Seperti yang bisa kita lihat di atas, fib (4) dan fib (3) keduanya menggunakan fib (2). begitu pula banyak fib (x) yang diulang. itu sebabnya Fibonacci memiliki sub-masalah yang tumpang tindih.
sumber