動的プログラミングアルゴリズムと実際の使用法

私は古典的なDP問題とアルゴリズム(コイン、最長増加サブシーケンス、最長共通サブシーケンスなど)を過去に研究しました。

私はこれらのアルゴリズムが実用的なアプリケーションを持っていることを知っています。私はこれらのアルゴリズムが入力のサイズが非常に大きく、問題が1台のマシンで解決できない最新のコンピュータサイエンスで実用的なアプリケーションを持っているかどうかです。

私の指摘は、これらのアルゴリズムは並列化が非常に難しいことです(つまり、並列動的プログラミング)、メモリ占有ほとんどの調合では二次的なので、合理的に大きな入力を処理することは困難です。

誰もがこれに関する実世界のユースケースを持っていますか?

4
LCSは線形空間を用いて解くことができる。 LCSに最大限の限界を置くことで、時間もリニアに引き下げることができる、と私は思う。
追加された 著者 Fred Foo,
@UmNyobe:fibonachiは良い例ではありませんが、 O(1) :)で解くことができます。
追加された 著者 amit,
メモリ占有率は2次ですが、保存される時間は1バイトごとに価値があります。 reccurence relationに基づくFibonnaciシーケンスを計算するプログラムの2つの実装を記述します。プロファイルを作成し、結果を確認します。
追加された 著者 UmNyobe,
だから私は再発の関係に基づいて言ったのです。フィボナナシを例に取ったのは、30分で完了できるからです。
追加された 著者 UmNyobe,
フィボナッチはDPを使わずにメモを使う。私はそれが関連していることに同意する。
追加された 著者 Savino Sguera,

2 答え

実用的なアプリケーション: diff これは、最も長い共通のサブシーケンス問題を解決することによって、2つのファイルの違いを見つけるための必須のLinuxユーティリティです。 DPアルゴリズム。

DPアルゴリズムは、多くの場合、実際の唯一の解決策であるため使用されます。それに加えて、彼らには何も間違っていません。

Memory usage: Often, a sliding window can be used to reduce the memory usage dramatically. Fibonacci, when solved using a naive bottom-up DP, requires O(n) memory. A sliding window improves this to O(1) memory (I know of the magical constant time solution, but that's beside the point).

Parallelization: Top-down DPs are often easy to parallelize. Bottom-ups may or may not be. @amit's example (parallelizing longest common subsequence) is a good one, where any given diagonal's tiles can be solved independently as long as the previous diagonals are known.

5
追加された

The longest common subsequence problem and Longest common substring problem are sometimes important for analyzing strings [analyzing genes sequence, for example]. And they can be solved efficiently using dynamic programming.

このアルゴリズムを並列化することができます。対角線上の反復で[左から、右へ、上へ] - 合計で 2n-1 回の反復を行います。すべての対角線では、各セルはこの対角線上の他のセルに依存しないため、ここで並列化を行うことができます。各スレッドはこの対角線内にセルブロックを持ちます。

この方法を使用したデータ同期も最小限であることに注意してください。各スレッドは、メモリが共有されていなくても実行できるように、「隣接スレッド」にデータを転送するだけでよい。

また、@ larsmansが指摘しているように、線形空間を使うこともできます。それぞれの点で、行列全体ではなく、現在の+2最後の対角線を「記憶」するだけです。

Another common problem that is solved using dynamic programming is polynomial interpolation. The interpolation can be effieciently done using Newton Interpolation, which first needs to calculate the divided differences - which is built using dynamic programming.

1
追加された
@SavinoSguera:(1)私は編集し、実用的なdpのための余分なアプリケーションを追加しました。 (2)私はこのアルゴリズムを並列化する方法を私の答えで紹介しました。これらのアルゴリズムはこれらの並列化方法を使ってスケーラブルです。 rel="nofollow noreferrer">地図の縮小を繰り返し使用して、その場で行列を構築することもできます。反復[私が提示したように]はお互いに依存しません。
追加された 著者 amit,
@SavinoSgueraまた、遺伝的アルゴリズムと遺伝的解析のアルゴリズムは同じではないことに注意してください
追加された 著者 amit,
私はそれらが遺伝的アルゴリズムに有用であることを知っています(私は質問を改善しました)。私はこれらが非自明な入力サイズに対して実際的であるかどうか質問しています。
追加された 著者 Savino Sguera,