動的プログラミングを使用して再帰アルゴリズムの時間の複雑さを軽減できるのはいつですか?


13

動的プログラミングは、再帰アルゴリズムの実行に必要な時間を短縮できます。動的プログラミングは、アルゴリズムの時間の複雑さを軽減するのに役立つことを知っています。再帰的アルゴリズムで満たされた場合、動的計画法を使用するとアルゴリズムの時間の複雑さが軽減されるという一般的な条件はありますか?動的プログラミングはいつ使用する必要がありますか?


回答:


9

動的プログラミングは、再帰アルゴリズムが同じ状況(入力パラメーター)に何度も到達していることがわかった場合に役立ちます。再帰アルゴリズムから、メモ化と呼ばれる動的プログラミングへの一般的な変換があります。これには、再帰プロシージャによって計算されたすべての結果を格納するテーブルがあります。すでに使用された一連の入力に対して再帰プロシージャが呼び出されると、結果はテーブルから取得されます。これにより、再帰フィボナッチが反復フィボナッチに削減されます。

ダイナミックプログラミングはさらにスマートになり、より具体的な最適化が適用されます。たとえば、特定の時点でテーブル全体をメモリに保存する必要がない場合があります。


カウンターは、メモ化のスペースの複雑さが入力データよりも大きい場合(おそらく> O(N)だけ)、動的プログラミングが役に立たない可能性があります。つまり、まれに同じ状況に遭遇したときです。
edA-qa mort-ora-y

1
メモ!=動的プログラミング!
ラファエル

1
私たちはそれを言っているとは思わないが、質問は時間の複雑さを減らすことを示している。動的プログラミング自体は、単に問題を分割するだけです。動的プログラミング+メモ化は、可能な場合に時間の複雑さを改善する一般的な方法です。
edA-qa mort-ora-y

@ edA-qamort-ora-y:そうです。OPが概念を混同/混合しているように見えるので、それを明確に指摘することが重要だと思います。
ラファエル

8

再帰アルゴリズムを高速化するだけなら、メモ化で十分です。これは、関数呼び出しの結果を保存して、同じパラメーターを使用した今後の呼び出しで結果を再利用できるようにする手法です。これは、関数が

  • 副作用がなく、
  • パラメータにのみ依存します(つまり、ある状態には依存しません)。

同じパラメーターを使用して関数が何度も呼び出された場合(およびその場合のみ)、時間を節約できます。一般的な例には、フィボナッチ数の再帰的な定義が含まれます。

f0=0f1=1fn+2=fn+1+fn n0

ffnfn+1

対照的に、メモ化はマージソートなどのアルゴリズムではほとんど役に立たないことに注意してください。

実際の実装では、結果を保存する方法はパフォーマンスに大きく影響します。ハッシュテーブルを使用することは明らかな選択かもしれませんが、ローカリティが壊れる可能性があります。パラメータが負でない整数である場合、配列は自然な選択ですが、一部のエントリのみを使用する場合は大きなメモリオーバーヘッドが発生する可能性があります。したがって、メモ化は効果とコストのトレードオフです。成果を上げるかどうかは、特定のシナリオによって異なります。


動的プログラミングは、まったく別の獣です。プロパティに関する問題に適用されます

  • (おそらく複数の方法で)サブ問題に分割できます。
  • これらの副問題は個別に解決できますが、
  • それらの副問題の(最適な)解は、元の問題の(最適な)解と組み合わせることができ、
  • 副問題には同じ特性があります(または些細な問題です)。

これは通常、人々がベルマンの最適性の原則を呼び出すときに暗示的に暗示されます。

現在、これは特定の種類の再帰によって表現できる問題のクラスのみを説明しています。メモは大きな効果に適用できるため、これらの評価は(多くの場合)効率的です(上記参照)。通常、小さな副問題は多くの大きな問題の一部として発生します。一般的な例には、編集距離ベルマンフォードアルゴリズムが含まれます


動的プログラミングが時間の複雑さを改善する場合があるが、メモ化は役に立たない(または少なくともそれほど多くない)場合があると言っていますか?例はありますか?または、動的プログラミングはメモ化が問題のサブセットに対してのみ有用であると言っているのですか?
svick

@svick:動的プログラミングはスピードアップしていないもの(!)(通常である場合)をDPの再帰がメモ化で評価されている場合にのみ、それ自体を。繰り返しますが、DPは再帰の問題をモデル化する方法であり、メモ化は適切な再帰アルゴリズムを高速化する手法です(DPに関係なく)。両方を直接比較することは意味がありません。もちろん、メモ化を適用することを期待しているため、素朴なアプローチよりも迅速に問題を解決できるため、問題をDPとしてモデル化しようとします。しかし、DPの観点からも、常に最も効率的なアルゴリズムが得られるとは限りません。
ラファエル

複数のプロセッサを使用できる場合、動的プログラミングにより、部品を並列化できるため、実際のパフォーマンスが大幅に向上します。ただし、実際には時間の複雑さは変わりません。
edA-qa mort-ora-y

@ edA-qamort-ora-y:すべての再帰に当てはまります。ただし、メモ化はプロセッサの境界を越えて効率が低いため、これが適切な高速化をもたらすかどうかは明らかではありません。
ラファエル

修正:DPの繰り返しの評価は、ブルートフォースよりも(かなり)高速です。cf. こちら
ラファエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.