動的計画法とメモ化

動的計画法とメモ化の違いについての考察結果を書いておきます。

動的計画法(dynamic programming)は、問題を部分問題に分割しながら処理を行なう際に、一度行なった部分問題の計算結果を表に保存することにより、効率的な処理を実現する方法一般を指す言葉です。

一方、メモ化(memoization)は、プログラムコードの中で、関数の計算の結果を保存しておき、同じ引数による関数呼び出しがあった場合は、保存した結果を返すというものです。造語のmemoization自体は1968年から存在するようです。

この2つの違いを述べると、動的計画法は、アルゴリズムを工夫することにより、過去の計算結果を表に保存し問題を高速に解く手法を広くカバーする「概念」で、メモ化というのは、実装レベルで過去の計算結果を再利用して高速化する「実現手法」のひとつという説明で良いように思います。

MITのProf. Charles Leisersonの講義ビデオの中でも、コーディング例の中でmemoizationが説明されています(0:46:00あたりから)。

http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-046JFall-2005/VideoLectures/detail/embed15.htm

コーディングのレベルでの違いをみると、動的計画法がループを使ってボトムアップに表を埋めて解を求めるのに対して、メモ化は再帰的に関数呼び出しを行ないながら解を求めるようなトップダウンのコードになります。

また、問題分割の際には動的計画法が最適解を保証する部分問題に分割していくのに対し、メモ化にはそのような制約はありません(メモ化を含むアルゴリズムでも、メモ化された関数の値で部分問題の最適解になっている方が望ましいですが)。