Jika Anda hanya ingin mempercepat algoritme rekursif Anda, memoisasi mungkin cukup. Ini adalah teknik menyimpan hasil panggilan fungsi sehingga panggilan di masa depan dengan parameter yang sama bisa menggunakan kembali hasilnya. Ini berlaku jika (dan hanya jika) fungsi Anda
- tidak memiliki efek samping dan
- tidak hanya tergantung pada parameternya (yaitu tidak pada beberapa negara).
Ini akan menghemat waktu Anda jika (dan hanya jika) fungsi dipanggil dengan parameter yang sama berulang-ulang. Contoh-contoh populer termasuk definisi rekursif dari angka-angka Fibonacci, yaitu
f(0)f(1)f(n+2)=0=1=f(n+1)+f(n), n≥0
Ketika dievaluasi secara naif, sering disebut secara eksponensial. Dengan memoisasi, selalu dihitung dengan , sehingga hanya sejumlah panggilan linear yang tersisa.f ( n ) f ( n + 1 )ff(n)f(n+1)
Perhatikan bahwa, sebaliknya, memoisasi hampir tidak berguna untuk algoritma seperti penggabungan: biasanya beberapa (jika ada) sebagian daftar identik, dan pemeriksaan kesetaraan mahal (pengurutan hanya sedikit lebih mahal!).
Dalam implementasi praktis, cara Anda menyimpan hasil sangat penting untuk kinerja. Menggunakan tabel hash mungkin merupakan pilihan yang jelas, tetapi mungkin merusak wilayah. Jika parameter Anda adalah bilangan bulat non-negatif, array adalah pilihan alami tetapi dapat menyebabkan overhead memori yang besar jika Anda hanya menggunakan beberapa entri. Oleh karena itu, memoisasi adalah pertukaran antara efek dan biaya; apakah itu terbayar tergantung pada skenario spesifik Anda.
Pemrograman dinamis adalah binatang yang sepenuhnya lain. Itu berlaku untuk masalah dengan properti itu
- dapat dipartisi menjadi sub-masalah (mungkin lebih dari satu cara),
- subproblem tersebut dapat diselesaikan secara mandiri,
- solusi (optimal) dari subproblem tersebut dapat digabungkan ke (optimal) solusi dari masalah asli dan
- subproblem memiliki properti yang sama (atau sepele).
Ini biasanya (secara implisit) tersirat ketika orang-orang menggunakan Bellman Principle of Optimality .
Sekarang, ini hanya menggambarkan kelas masalah yang dapat diekspresikan oleh jenis rekursi tertentu. Evaluasi hal-hal itu (sering) efisien karena memoisasi dapat diterapkan dengan efek yang besar (lihat di atas); biasanya, subproblem yang lebih kecil terjadi sebagai bagian dari banyak masalah yang lebih besar. Contoh populer termasuk jarak edit dan algoritma Bellman-Ford .