ランタイムにログを記録する動的プログラミングアルゴリズム


7

動的プログラミングアルゴリズムの古典的な例のほとんどには、やなどのランタイムがあります。ランタイムの自然な例はありますか?n2Oログ


ソートのための分割統治アルゴリズムを取ります。
Nicholas Mancuso

4
@NicholasMancuso:サブ問題が重複していないため、Divide and Conquerは動的プログラミングではありません。
A.Schulz

@ A.Schulz実はそうです。同じサブシーケンスが再発の複数のブランチに表示される場合があります(私はMergesort再発を考えています)。これ以上の高速化は必要ないので、ソート中にこれを無視します。すべての入力に対して1つのパーティショニングのみを試行し、最適な(ソートされた)ソリューションを見つける必要があるという事実が効果を支配します。
ラファエル

回答:


3

1つの自然な例は、シーケンスの最も長く増加するサブシーケンスを見つけることです。 番号。候補サブシーケンスは、入力シーケンスでリンクできます。これはかなり一般的な演習であり、他のタイプのサブシーケンスでも機能します。実際には、Cormenらの第3版の15.4-6の演習です。本も。アルゴリズムについては、これらのノートのセクション2.2を参照してください。


1

私のコメントを拡大するには:

並べ替えは「テーブルルックアップ」を実行しませんが、DPの実際の定義を覚えておいてください。

最適な部分構造を持つ問題を解決する方法。

ソートのための分割統治アプローチがこれを満たしていることがわかります。


1
DPのより微妙な定義に興味があります。あなたの例では、副問題の重複はなく、メモも必要ありません。
Joe

私の知る限り、「DPの実際の定義」というものはありません。「最適な部分構造」という用語もあまり正確ではありません。回答のステートメントに関して、DPの概念をデータ変換の問題(通常、考慮されるのは最適化と決定の問題のみが考慮される)に拡張する場合、私は、たとえばMergesortの再発をDPの再発と呼ぶのが妥当だと思います。ただし、パーティショニングを1つだけ試行する必要があるため、これは非常に特殊なケースです。
ラファエル

DPは当然ボトムアップですが、分割統治法はリバース方式です(これもメモ化とは関係ありません)。

1
皆様へ。分割統治は、DPの最も一般的な形式に実際には準拠しないことに同意します。技術的な理由から特別なケースであると常に感じていました(最適な部分構造、つまりベルマンの最適性の原理)。しかし、ジョーのコメントに照らして、おそらく私はもっと説得力のある例を提供するべきです。;)
Nicholas Mancuso
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.